2009-07-08 22 views
12

पर लिखते समय() भेजने के बजाय लिखने() के प्रदर्शन का उपयोग करने का प्रदर्शन प्रभाव मैं विशिष्ट सॉकेट एपीआई का उपयोग करके लिनक्स प्लेटफ़ॉर्म पर सी ++ में नेटवर्क एप्लिकेशन लिखने पर काम कर रहा हूं, और मैं लिखने के 2 वैकल्पिक तरीकों को देख रहा हूं एक टीसीटी धारा के लिए एक बाइट सरणी: या तो लिखने(), या कॉल() भेजकर। मुझे पता है कि, चूंकि यह लिनक्स है, इसलिए सॉकेट हैंडल बस एक फ़ाइल डिस्क्रिप्टर है, और इसलिए यह सॉकेट पर पढ़ने() और लिखने() कॉल करने के लिए मान्य है, हालांकि सॉकेट एपीआई भी भेजता है() और आरईवी () एक ही कार्य करने के लिए कार्य करता है।सॉकेट

इसलिए मुझे आश्चर्य है कि क्या एक दूसरे के कार्यों के एक वर्ग को चुनने का कोई विशेष कारण है - क्या नेटवर्क लेखन/पढ़ने के लिए अनुकूलित/आरईवी कार्यों को अनुकूलित किया गया है, क्या वे बेहतर प्रदर्शन करते हैं? या क्या यह वास्तव में मनमानी है जिसका मैं उपयोग करता हूं? पढ़िए() और लिखो() सभी मामलों में ठीक से व्यवहार करते हैं?

किसी भी अंतर्दृष्टि के लिए धन्यवाद!

उत्तर

19

कोई अंतर नहीं होना चाहिए। man 2 send से हवाला देते हुए:

फर्क सिर्फ इतना है send() और write() के बीच झंडे की उपस्थिति है। शून्य झंडे पैरामीटर के साथ, send()write() के बराबर है।

जब तक आप निर्दिष्ट करने के लिए नहीं करना चाहते हैं और send() के लिए झंडे आप write() स्वतंत्र रूप से उपयोग कर सकते हैं के रूप में

+0

क्या यह फ्रीबीएसडी या अन्य प्लेटफार्मों के बारे में भी सच है? - वह लाइन मेरे प्रेषण (2) मैन पेज में प्रकट नहीं होती है। –

+0

@ गुडपर्सन यह सभी प्लेटफॉर्म पर लागू होता है। यदि ऐसा नहीं था, तो 'inetd' और जैसा काम नहीं करेगा। ('inetd' आपकी सॉकेट को आपकी डेमॉन प्रक्रिया के stdin और stdout में डुप्लिकेट करता है, और आपकी प्रक्रिया सामान्य रूप से stdin और stdout के साथ सीधे बातचीत कर सकती है, बिना किसी जागरूकता के कि वे सॉकेट हैं। बेशक, आप उनके साथ सॉकेट सामान भी कर सकते हैं।) –

6

recv और send आपको आउट-ऑफ-बैंड पैकेट के लिए झंडे निर्दिष्ट करने की अनुमति देता है। यदि आपको झंडे निर्दिष्ट करने की आवश्यकता नहीं है, read और write पूरी तरह से पर्याप्त हैं।

1

write बनाम। send एक बाइट के लिए, या एक सरणी शायद बहुत अलग नहीं होगी - वे जल्द ही एक ही कोड पथ समाप्त कर देंगे (आखिरकार वे एक ही ऑपरेशन करते हैं)। नेटवर्क ट्रांसमिशन में ओवरहेड उस स्तर पर होने की संभावना नहीं है; यह वास्तविक टीसीपी कनेक्शन और तारों पर बिट्स को स्थानांतरित करेगा।

हालांकि, यदि आप एक ही समय में बड़े, मल्टीपार्ट संदेशों को भेजने का इरादा रखते हैं तो आपको sendmsg() सिस्कल पर देखना चाहिए - इससे आपको डेटा भेजने के लिए गैर-संगत सरणी की एक सूची निर्दिष्ट करने की अनुमति मिलती है।

दिन के अंत में सामान्य दिशानिर्देश लागू होते हैं - पहले आवेदन लिखें, फिर बेंचमार्क देखें कि आपकी बाधाएं कहां हैं।

+1

प्राप्त करने/भेजने के लिए गैर-संगत सरणी पर: readv और writev भी अनुमति देता है। स्कैटर/इकट्ठा करने के लिए हाँ I/O! –