सभी को लगता है कि नाम पाइप पाइप सॉकेट आईपीसी से तेज हैं। वे कितने तेज हैं? मैं सॉकेट्स का उपयोग करना पसंद करूंगा क्योंकि वे दो-तरफ़ा संचार कर सकते हैं और बहुत लचीले हैं, लेकिन लचीलेपन पर गति का चयन करेंगे यदि यह काफी मात्रा में है।
सभी को लगता है कि नाम पाइप पाइप सॉकेट आईपीसी से तेज हैं। वे कितने तेज हैं? मैं सॉकेट्स का उपयोग करना पसंद करूंगा क्योंकि वे दो-तरफ़ा संचार कर सकते हैं और बहुत लचीले हैं, लेकिन लचीलेपन पर गति का चयन करेंगे यदि यह काफी मात्रा में है।
जवाबों:
मेरा सुझाव है कि आप पहले आसान रास्ता अपनाएं, ध्यान से आईपीसी तंत्र को अलग करें ताकि आप सॉकेट से पाइप में बदल सकें, लेकिन मैं निश्चित रूप से पहले सॉकेट के साथ जाऊंगा। यह सुनिश्चित होना चाहिए कि आईपीसी का प्रदर्शन पूर्वनिर्धारित अनुकूलन से पहले एक समस्या है।
और अगर आप आईपीसी की गति के कारण परेशानी में पड़ते हैं, तो मुझे लगता है कि आपको पाइप पर जाने के बजाय साझा मेमोरी पर स्विच करने पर विचार करना चाहिए।
यदि आप कुछ स्थानांतरण गति परीक्षण करना चाहते हैं, तो आपको सोसाइटी की कोशिश करनी चाहिए , जो एक बहुत ही बहुमुखी कार्यक्रम है जो आपको लगभग किसी भी प्रकार की सुरंग बनाने की अनुमति देता है।
सर्वश्रेष्ठ परिणाम आपको साझा मेमोरी समाधान के साथ मिलेंगे ।
नामित पाइप टीसीपी सॉकेट्स से केवल 16% बेहतर हैं ।
परिणाम IPC बेंचमार्किंग के साथ मिलते हैं :
पाइप बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 27367.454 ms
Average duration: 27.319 us
Minimum duration: 5.888 us
Maximum duration: 15763.712 us
Standard deviation: 26.664 us
Message rate: 36539 msg/s
एफआईएफओ (नामित पाइप) बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 38100.093 ms
Average duration: 38.025 us
Minimum duration: 6.656 us
Maximum duration: 27415.040 us
Standard deviation: 91.614 us
Message rate: 26246 msg/s
संदेश कतार बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 14723.159 ms
Average duration: 14.675 us
Minimum duration: 3.840 us
Maximum duration: 17437.184 us
Standard deviation: 53.615 us
Message rate: 67920 msg/s
साझा मेमोरी बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 261.650 ms
Average duration: 0.238 us
Minimum duration: 0.000 us
Maximum duration: 10092.032 us
Standard deviation: 22.095 us
Message rate: 3821893 msg/s
टीसीपी कुर्सियां बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 44477.257 ms
Average duration: 44.391 us
Minimum duration: 11.520 us
Maximum duration: 15863.296 us
Standard deviation: 44.905 us
Message rate: 22483 msg/s
यूनिक्स डोमेन सॉकेट बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 24579.846 ms
Average duration: 24.531 us
Minimum duration: 2.560 us
Maximum duration: 15932.928 us
Standard deviation: 37.854 us
Message rate: 40683 msg/s
ZeroMQ बेंचमार्क:
Message size: 128
Message count: 1000000
Total duration: 64872.327 ms
Average duration: 64.808 us
Minimum duration: 23.552 us
Maximum duration: 16443.392 us
Standard deviation: 133.483 us
Message rate: 15414 msg/s
मैं शोडेनेक्स से सहमत होने जा रहा हूं, ऐसा लगता है कि आप समय से पहले कुछ ऐसा करने की कोशिश कर रहे हैं जो अभी तक समस्याग्रस्त नहीं है। जब तक आप जानते हैं कि कुर्सियां एक अड़चन बनने वाली हैं, मैं बस उनका उपयोग करूंगा।
बहुत सारे लोग जो नामित पाइपों की कसम खाते हैं, वे थोड़ी बचत पाते हैं (इस पर निर्भर करता है कि बाकी सब कुछ कितना अच्छा लिखा गया है), लेकिन यह उस कोड के साथ समाप्त होता है जो आईपीसी के उत्तर के लिए अधिक समय व्यतीत करता है क्योंकि यह उपयोगी काम नहीं करता है। निश्चित रूप से, गैर-अवरुद्ध योजनाएं इसकी मदद करती हैं, लेकिन वे मुश्किल हो सकते हैं। आधुनिक युग में पुराने कोड को लाने के वर्षों में, मैं कह सकता हूं, मैंने देखा है कि अधिकांश मामलों में स्पीडअप लगभग शून्य है।
यदि आप वास्तव में सोचते हैं कि कुर्सियां आपको धीमा करने जा रही हैं, तो गेट से बाहर जाने के लिए साझा स्मृति का उपयोग करके सावधानीपूर्वक ध्यान दें कि आप ताले का उपयोग कैसे करते हैं। फिर, सभी वास्तविकताओं में, आपको एक छोटा स्पीडअप मिल सकता है, लेकिन ध्यान दें कि आप इसके एक हिस्से को बर्बाद कर रहे हैं जो पारस्परिक बहिष्कार ताले पर प्रतीक्षा कर रहे हैं। मैं के लिए एक यात्रा की वकालत करने नहीं जा रहा हूँ futex नरक (ठीक है, नहीं काफी अपने अनुभव के आधार पर 2015 में अब और नरक,)।
पाउंड के लिए पाउंड, सॉकेट्स (लगभग) हमेशा एक अखंड कर्नेल के तहत उपयोगकर्ता अंतरिक्ष आईपीसी के लिए जाने का सबसे अच्छा तरीका है .. और (आमतौर पर) डिबग और बनाए रखने के लिए सबसे आसान है।
ध्यान रखें कि सॉकेट्स का मतलब आईपी (और टीसीपी या यूडीपी) नहीं है। आप UNIX सॉकेट्स (PF_UNIX) का भी उपयोग कर सकते हैं, जो 127.0.0.1 से कनेक्ट करने पर ध्यान देने योग्य प्रदर्शन सुधार प्रदान करता है
जैसा कि अक्सर, संख्या भावना से अधिक कहती है, यहां कुछ डेटा हैं: पाइप बनाम यूनिक्स सॉकेट प्रदर्शन (opendmx.net) ।
यह बेंचमार्क पाइप के लिए लगभग 12 से 15% तेज गति का अंतर दर्शाता है।
नामित पाइप के साथ दो तरह से संचार के लिए:
नामांकित पाइपों को लागू करना काफी आसान है।
उदाहरण के लिए, मैंने सी में नामित पाइपों के साथ सी में एक परियोजना को लागू किया, धन्यवाद जो कि फ़ाइल के इनपुट-आउटपुट आधारित संचार (fopen, fprintf, fscanf ...) के लिए था, यह इतना आसान और साफ था (यदि यह भी एक विचार है)।
मैंने उन्हें जावा के साथ भी कोडित किया (मैं धारावाहिक बना रहा था और उन पर ऑब्जेक्ट भेज रहा था!)
नामित पाइपों में एक नुकसान है:
सॉकेट्स के साथ एक समस्या यह है कि उनके पास बफर को फ्लश करने का एक तरीका नहीं है। वहाँ कुछ नागल एल्गोरिथम कहा जाता है जो सभी डेटा एकत्र करता है और इसे 40ms के बाद फ्लश करता है। तो अगर यह जवाबदेही है और बैंडविड्थ नहीं तो आप पाइप से बेहतर हो सकते हैं।
आप सॉकेट विकल्प TCP_NODELAY के साथ नागल को अक्षम कर सकते हैं, लेकिन तब रीडिंग एंड को कभी भी एक ही रीड कॉल में दो छोटे संदेश प्राप्त नहीं होंगे।
तो यह परीक्षण, मैं इस में से किसी के साथ समाप्त हो गया और साझा स्मृति में pthread mutex और semaphore के साथ स्मृति मैप आधारित कतारें लागू की, बहुत सारे कर्नेल सिस्टम कॉल से बचा (लेकिन आज वे अब बहुत धीमी गति से नहीं हैं)।
नामित पाइप और सॉकेट कार्यात्मक रूप से समतुल्य नहीं हैं; सॉकेट्स अधिक सुविधाएँ प्रदान करते हैं (वे एक शुरुआत के लिए द्विदिश हैं)।
हम आपको यह नहीं बता सकते कि कौन बेहतर प्रदर्शन करेगा, लेकिन मुझे दृढ़ता से संदेह है कि यह कोई फर्क नहीं पड़ता।
यूनिक्स डोमेन सॉकेट्स टीसीपी सॉकेट्स को बहुत अधिक कर देगा, लेकिन केवल स्थानीय मशीन पर और (शायद थोड़ा सा) निचले माथे पर।
यदि यूनिक्स सॉकेट पर्याप्त तेज़ नहीं है और आप बहुत अधिक डेटा स्थानांतरित कर रहे हैं, तो अपने क्लाइंट और सर्वर के बीच साझा मेमोरी का उपयोग करने पर विचार करें (जो कि सेट अप करने के लिए बहुत अधिक जटिल है)।
यूनिक्स और एनटी दोनों में "नामित पाइप" हैं, लेकिन वे फीचर सेट में पूरी तरह से अलग हैं।
आप ZeroMQ [ zmq / 0mq ] जैसे हल्के समाधान का उपयोग कर सकते हैं । यह उपयोग करने में बहुत आसान है और नाटकीय रूप से तेजी से सॉकेट करता है।
nanomsg
। वैसे भी, इस महान जगह का स्वागत और आनंद लें और यह सक्रिय रूप से योगदान करने वाला सदस्य बन गया।
pipe(2)
(एर,;mkfifo(3)
) विजेता हो सकता है, लेकिन आप तब तक नहीं जान पाएंगे जब तक आप कोशिश नहीं करेंगे।