2009-05-31 14 views
6

क्या अंतर है - प्रदर्शन-वार - एक सॉकेट 1 बाइट से पढ़ने के बीच एक बार बनाम बड़े हिस्से में पढ़ने के बीच?बड़े सॉंक में एक सॉकेट बनाम एक बार बनाम पढ़ना

मेरे पास एक सी ++ एप्लिकेशन है जिसे वेब सर्वर से पृष्ठों को खींचने और लाइन द्वारा प्राप्त पृष्ठ रेखा को पार्स करने की आवश्यकता है। वर्तमान में, मैं एक बार में 1 बाइट पढ़ रहा हूं जब तक कि मुझे एक सीआरएलएफ नहीं मिलता है या अधिकतम 1024 बाइट्स तक पहुंच जाता है।

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

संपादित करें:

मैं बहुत बड़ा बफर खर्च नहीं उठा सकते। मैं एक बहुत तंग कोड बजट में हूं क्योंकि एप्लिकेशन को एम्बेडेड डिवाइस में उपयोग किया जाता है। मैं केवल एक निश्चित आकार के बफर को रखना पसंद करता हूं, एक समय में एक एचटीएमएल लाइन को पकड़ने के लिए। यह मेरी पार्सिंग और अन्य प्रसंस्करण को आसान बनाता है क्योंकि जब भी मैं पार्सिंग के लिए बफर तक पहुंचने का प्रयास करता हूं, तो मुझे लगता है कि मैं एक पूर्ण HTML लाइन को संसाधित कर रहा हूं।

धन्यवाद।

+0

क्या आप एम्बेड किए गए डिवाइस पर अधिक जानकारी दे सकते हैं? क्या इसमें भी एक ऑपरेटिंग सिस्टम है? –

उत्तर

4

आप, और एक मध्यवर्ती उच्च स्तर प्रतिनिधित्व कि बफ़र किया जा सकता से नहीं सॉकेट से सीधे पढ़ रहे हैं, फिर बिना किसी संभावित संदेह के, 1024 बाइट्स को पूरी तरह पढ़ना बेहतर है, उन्हें रैम में एक बफर में रखें, और फिर रैम से डेटा को पार्स करें।

क्यों? सॉकेट पर पढ़ना एक सिस्टम कॉल है, और यह प्रत्येक पढ़ने पर एक संदर्भ स्विच का कारण बनता है, जो महंगा है। इसके बारे में और पढ़ें: IBM Tech Lib: Boost socket performances

+0

+1 - मुझे आपकी तर्क पसंद है कि क्यों बड़े हिस्से में पढ़ना बेहतर प्रदर्शन-वार है। मुझे लगता है कि मैं अपनी दूसरी चिंता को हल करने के लिए नील बटरवर्थ के जवाब के लिए बस सकता हूं। =) –

1

सबसे पहले और सबसे सरल:

cin.getline(buffer,1024); 

दूसरा, आम तौर पर सभी आईओ तो आपको चिंता करने की बहुत ज्यादा

तीसरा, सीजीआई की प्रक्रिया शुरू की जरूरत नहीं है बफ़र है आम तौर पर बहुत अधिक तो इनपुट प्रसंस्करण (जब तक की लागत यह फ़ाइल विशाल है) ... तो आप इसके बारे में सोच नहीं सकते हैं।

1

G'day,

बड़ा प्रदर्शन हिट फिल्मों में से एक एक समय में यह एक बाइट करके कि आपके संदर्भ अधिक से अधिक प्रणाली समय में उपयोगकर्ता-समय पर जा रहा है है। और खत्म। बिल्कुल कुशल नहीं है।

आम तौर पर एक एमटीयू आकार तक, एक बड़े हिस्से को पकड़ना, मापने योग्य रूप से अधिक कुशल है।

सामग्री को वेब वेक्टर की लाइनों में अलग करने के लिए \ n के लिए एक वेक्टर में पुन: स्कैन क्यों नहीं किया जाता है?

HTH

चियर्स,

+0

हां, कॉल की संख्या के आधार पर, फ़ंक्शन कॉल के कारण सापेक्ष ओवरहेड वास्तव में किसी बिंदु पर महत्वपूर्ण हो सकता है। – none

5

मैं सी पर ++ टिप्पणी नहीं कर सकता, लेकिन अन्य प्लेटफार्मों से - हाँ, यह एक बड़ा फर्क कर सकते हैं; खासतौर पर स्विच की मात्रा में कोड की आवश्यकता होती है, और धाराओं की एसिंक प्रकृति आदि के बारे में चिंता करने की आवश्यकता होती है।

लेकिन असली परीक्षण, निश्चित रूप से इसे प्रोफाइल करने के लिए है। एक मूल ऐप क्यों न लिखें जो दोनों दृष्टिकोणों का उपयोग करके मनमानी फ़ाइल के माध्यम से मंथन करता है, और कुछ सामान्य फ़ाइलों के लिए इसका परीक्षण करता है ... प्रभाव आमतौर पर चौंकाने वाला होता है, यदि कोड IO बाध्य है। यदि फाइलें छोटी हैं और आपके अधिकांश ऐप रनटाइम प्रोसेसिंग डेटा मेमोरी में एक बार डेटा खर्च करते हैं, तो आपको कोई फर्क नहीं पड़ता है।

1

आप सॉकेट से एक समय में एक बाइट नहीं पढ़ रहे हैं, तो आप सी/सी ++ आई/ओ सिस्टम से एक एटिम पर एक बाइट पढ़ रहे हैं, यदि आप सीजीआई का उपयोग कर रहे हैं तो अलगाव ने सभी इनपुट को buffered किया होगा सॉकेटBuffered I/O का पूरा बिंदु प्रोग्रामर को डेटा को इस तरह से उपलब्ध कराने के लिए है कि उनके लिए प्रक्रिया सुविधाजनक हो, इसलिए यदि आप एक बार में एक बाइट को संसाधित करना चाहते हैं, तो आगे बढ़ें।

संपादित करें: प्रतिबिंब पर, यदि आप सीजीआई लागू कर रहे हैं या बस इसका उपयोग कर रहे हैं तो यह आपके प्रश्न से स्पष्ट नहीं है। आप कोड स्निपेट पोस्ट करके इसे स्पष्ट कर सकते हैं जो इंगित करता है कि वर्तमान में आप उस बाइट को कैसे पढ़ते हैं।

यदि आप सीधे सॉकेट पढ़ रहे हैं, तो आपको बस एक बफर में GET को पूरी प्रतिक्रिया पढ़नी चाहिए और फिर इसे संसाधित करना चाहिए। इसमें प्रदर्शन और कोडिंग की आसानी सहित कई फायदे हैं।

यदि आप एक छोटे बफर करने के लिए linitted रहे हैं, तो जैसे क्लासिक बफरिंग एल्गोरिदम का उपयोग:

getbyte: 
    if buffer is empty 
     fill buffer 
     set buffer pointer to start of buffer 
    end 
    get byte at buffer pointer 
    increment pointer 
+0

नहीं। मैं एक सॉकेट से पढ़ रहा हूँ। मैं वेब सर्वर पर HTTP GET अनुरोध कर रहा हूं और सॉकेट से प्रतिक्रिया पढ़ता हूं। मैं ऐसा इसलिए करता हूं क्योंकि मुझे पूरी तरह से प्रस्तुत और पार्स गतिशील सामग्री की आवश्यकता है। –

+0

सोचें कि मैं थोड़ा बदलाव के साथ इस एल्गोरिदम के साथ बस सकता हूं। मेरे पास दो निश्चित आकार बफर हो सकते हैं। एक संपूर्ण पढ़ने के लिए (512 बाइट्स कहें), इसे स्कैन करें और एक और बफर पर एक पूर्ण एचटीएमएल लाइन स्टोर करें जिसे मैं अपने अन्य पार्सिंग विधियों में आसानी से एक्सेस कर सकता हूं। मेरे पास एक अधिक कुशल सॉकेट रीडिंग दिनचर्या हो सकती है और मैं अभी प्रसंस्करण की आसानी को रख सकता हूं (यानी मेरी पूरी विधियां एक पूर्ण HTML लाइन मानती हैं)। धन्यवाद। =) –

0

ऑपरेटिंग सिस्टम स्तर पर कोई अंतर नहीं है, वैसे भी डेटा buffered हैं। हालांकि, आपके आवेदन को एक बार में बाइट्स को "पढ़ने" के लिए अधिक कोड निष्पादित करना होगा।

1

आप fdopen() फ़ंक्शन के साथ सॉकेट फ़ाइल descritpor खोल सकते हैं। फिर आपने आईओ को buffered किया है ताकि आप fgets() या उस वर्णनकर्ता पर समान कॉल कर सकें।

+0

-1 सुझाव देने के लिए()। – bk1e

+0

क्षमा करें, मेरा मतलब है fgets(), अब मेरा जवाब संपादित किया :-( – codymanix

+0

आप कैसे कर सकते हैं !! – LukeN

संबंधित मुद्दे