मैंने कहीं पढ़ा है कि snprintf ostringstream से तेज है। क्या किसी के पास इसका कोई अनुभव है? यदि हां यह तेज़ क्यों है।ostringstream की तुलना में snprintf तेज क्यों है या है ना?
उत्तर
std::ostringstream
धीमी होने के लिए आवश्यक है, लेकिन लागू होने पर आमतौर पर धीमा होता है। FastFormat's website has some benchmarks।
धाराओं के लिए मानक लाइब्रेरी डिज़ाइन snprintf
से अधिक का समर्थन करता है। डिजाइन का विस्तार एक्स्टेंसिबल होना है, और protected
virtual
विधियों को सार्वजनिक रूप से उजागर तरीकों से बुलाया जाता है। यह आपको आश्वासन के साथ धारा वर्गों में से एक से प्राप्त करने की अनुमति देता है कि यदि आप protect
एड विधि को अधिभारित करते हैं तो आपको वह व्यवहार मिल जाएगा जो आप चाहते हैं। मेरा मानना है कि एक कंपाइलर virtual
फ़ंक्शन कॉल के ऊपरी हिस्से से बच सकता है, लेकिन मुझे ऐसा करने वाले किसी भी कंपाइलर से अवगत नहीं है।
इसके अतिरिक्त, स्ट्रीम ऑपरेशंस अक्सर आंतरिक रूप से बढ़ने योग्य बफर का उपयोग करते हैं; जो अपेक्षाकृत धीमी स्मृति आवंटन का तात्पर्य है।
यह काफी संभव है क्योंकि sprintf
असेंबली में लिखे गए सीआरटी का हिस्सा है। ostringstream
एसटीएल का हिस्सा है, और शायद थोड़ा और अधिक सामान्य रूप से लिखा गया है, और इसके साथ निपटने के लिए ओओपी कोड/ओवरहेड है।
मैं बहुत दृढ़ता से शक किसी को संभवतः स्वपीड़न में एक अभ्यास के रूप में छोड़कर विधानसभा में _ever_ लागू किया 'sprintf' है (' timethis 'उपलब्ध वेब पर कहीं है)। यूनिक्स वी 6 पर वापस जाने के लिए, सी रनटाइम लाइब्रेरी स्वयं सी में लिखी गई है (सी में लिखने के लिए _impossible_ की एक छोटी मुट्ठी भर को छोड़कर, 'setjmp' की तरह)। – zwol
बिल्कुल यह कार्यान्वयन-विशिष्ट है।
लेकिन यदि आप वास्तव में जानना चाहते हैं, तो दो छोटे कार्यक्रम लिखें, और उनकी तुलना करें। आपको जो कुछ भी दिमाग में है उसके लिए आपको सामान्य उपयोग शामिल करने की आवश्यकता होगी, दोनों कार्यक्रमों को एक ही स्ट्रिंग उत्पन्न करने की आवश्यकता होगी, और आप समय की जानकारी देखने के लिए एक प्रोफाइलर का उपयोग करेंगे।
फिर आपको पता चलेगा।
एक कारण मुझे पता है कि कार्यों का printf परिवार संबंधित C++ फ़ंक्शंस (cout, cin, और अन्य धाराओं) से तेज़ है, बाद में टाइपशेकिंग करते हैं। चूंकि इसमें आमतौर पर अधिभारित ऑपरेटरों को कुछ अनुरोध शामिल होते हैं, इसमें कुछ समय लग सकता है।
वास्तव में, प्रोग्रामिंग प्रतियोगिताओं में अक्सर यह अनुशंसा की जाती है कि आप इस कारण से cout/cin के बजाय printf et al का उपयोग करें।
इस प्रकार के टाइपकेकिंग के साथ-साथ ऑपरेटर ओवरलोड को संकलित समय में हल किया जाता है। कम रनटाइम प्रदर्शन उनके द्वारा समझाया नहीं गया है। –
वास्तव में, printf() परिवार को रनटाइम पर प्रारूप को पार्स करना पड़ता है, जो अवलोकन – MSalters
सी ++ टाइपशेकिंग से मेल नहीं खाता है रनटाइम लागत नहीं है। जब तक आप * संकलन * गति के बारे में बात नहीं कर रहे हैं, उस स्थिति में '
कुछ लोग संभवतः आपको बताएंगे कि कार्य एक-दूसरे से तेज नहीं हो सकते हैं, लेकिन उनका कार्यान्वयन कर सकता है। यह सही है मुझे लगता है कि मैं सहमत होगा।
आपको कभी भी बेंचमार्क के अलावा किसी अंतर को देखने की संभावना नहीं है। सी ++ धाराओं आमतौर पर धीमे होने के कारण यह है कि वे अधिक लचीला हैं। लचीलापन अक्सर समय या कोड वृद्धि की लागत पर आता है।
इस मामले में, सी ++ धाराएं स्ट्रीम-बफर पर आधारित होती हैं। अपने आप में, धाराएं केवल पतवार होती हैं जो स्वरूपण और त्रुटि झंडे को जगह में रखती हैं, और सी ++ मानक लाइब्रेरी (उदाहरण के लिए, संख्याओं को मुद्रित करने के लिए num_put) के सही i/o
कॉल करें, जो अंतर्निहित धारा में मानों को अच्छी तरह से स्वरूपित करती हैं -बफर सी ++ धारा से जुड़ा हुआ है।
ये सभी तंत्र - पहलू, और बफर, वर्चुअल फ़ंक्शंस द्वारा कार्यान्वित किए जाते हैं।जबकि वहाँ वास्तव में है कोई निशान ध्यान दें, उन कार्यों ग stdio पेंडेंट से कि तथ्य यह है उन्हें कुछ हद तक सामान्य रूप से ग stdio कार्यों का उपयोग कर की तुलना में धीमी कर देगा धीमी लागू किया जाना चाहिए (मैं benchmark'ed उस के साथ पहले जीसीसी/libstdC++ और में कुछ समय तथ्य ने एक मंदी देखी - लेकिन जिसे आप दिन-दर-दिन उपयोग में शायद ही कभी ध्यान देते हैं)।
एक मुद्दा शायद हो सकता है कि ostringstream
से जोड़ा प्रकार सुरक्षा अतिरिक्त भूमि के ऊपर किया जाता है। हालांकि, मैंने कोई माप नहीं किया है।
हम sprintf के साथ आंतरिक छोरों में कुछ stringstreams प्रतिस्थापित (स्थिर आवंटित बफर का प्रयोग करके), और यह एक बड़ा अंतर बना दिया है, दोनों MSVC और जीसीसी में। मुझे लगता है कि इस कोड के गतिशील स्मृति प्रबंधन:
{ char buf[100]; int i = 100; sprintf(buf, "%d", i); // do something with buf }
से
{ std::stringstream ss; int i = 100; ss << i; std::string s = ss.str(); // do something with s }
बहुत सरल है, लेकिन मैं stringstreams के समग्र प्रदर्शन के साथ बहुत खुश हूँ।
litb said के रूप में, मानक धाराओं बहुत सी बातें हम हमेशा की जरूरत नहीं है समर्थन करते हैं। कुछ धाराओं कार्यान्वयन इस इस्तेमाल कभी नहीं किया लचीलापन से छुटकारा पाने के, उदाहरण के लिए FAStream देखते हैं।
FAStream के साथ क्या हुआ? मैंने मंच का उपयोग करके कुछ जवाब देखा है लेकिन अब मैं इसके बारे में कोई जानकारी नहीं ढूंढ पा रहा हूं। –
हां मुझे नहीं पता। मुझे लगता है कि सबसे अच्छा अपने लेखक से सीधे पूछना है। –
हाँ, यदि आप विजुअल C++ 5.0 के साथ कुछ लाख की संख्या पर नीचे समारोह चलाने के लिए, पहले संस्करण के बारे में दो बार के रूप में लंबे समय के दूसरे रूप में लेता है और एक ही उत्पादन पैदा करता है।
एक .exe में तंग loops संकलित और विंडोज timethis something.exe' or the Linux
समय कुछ चल रहा है 'मैं अपने प्रदर्शन प्रदर्शन जिज्ञासा की जांच कैसे करता हूं।
void Hex32Bit(unsigned int n, string &result)
{
#if 0
stringstream ss;
ss
<< hex
<< setfill('0')
<< "0x" << setw(8) << n
;
result = ss.str();
#else
const size_t len = 11;
char temp[len];
_snprintf(temp, len, "0x%08x", n);
temp[len - 1] = '\0';
result = temp;
#endif
}
- 1. फ़ंक्शन अभिव्यक्ति की तुलना में फ़ंक्शन घोषणा तेज है?
- 2. सी # में Startswith की तुलना में फ़ंक्शन isprefix तेज क्यों है?
- 3. बुलबुले का जावास्क्रिप्ट कार्यान्वयन अन्य एल्गोरिदम को सॉर्ट करने की तुलना में बहुत तेज क्यों है?
- 4. फ़ील्ड एक्सेस की तुलना में विधि पहुंच तेज क्यों लगती है?
- 5. उम्ब्राको याय या ना?
- 6. विम में \ (\) से \ \ (\) तेज क्यों है?
- 7. एंड्रॉइड की तुलना में आईओएस एमुलेटर बहुत तेज़ क्यों है?
- 8. जो तेज है, क्लोजर या क्लोजरस्क्रिप्ट (और क्यों)?
- 9. String.IsNullOrEmpty स्ट्रिंग की तुलना में तेज़ क्यों है। लम्बाई?
- 10. संग्रह क्यों है। काउंटर की तुलना में बहुत धीमी है।
- 11. क्यों mmap() अनुक्रमिक आईओ से तेज है?
- 12. पोस्टग्रेज़ से सौर इतनी तेज क्यों है?
- 13. memcache_get से file_get_contents तेज क्यों है?
- 14. सी #+ से सी # संकलित क्यों तेज है?
- 15. स्ट्रिंग की तुलना में मेरी स्ट्रिंग क्यों विफल रही है?
- 16. कोरों की तुलना में अधिक थ्रेड क्यों है?
- 17. LINQ की तुलना में Array.Sort() इतनी धीमी क्यों है?
- 18. एसवीएन? वीएसएस? दूसरे की तुलना में बेहतर क्यों है?
- 19. ग्रे की तुलना में डार्कग्रे हल्का क्यों है?
- 20. तुलना CONVERT में तुलना क्यों नहीं करती है?
- 21. जावा में एनम फाइनल पर तुलना करने की तुलना क्यों की जाती है?
- 22. एक सदस्य फ़ंक्शन पॉइंटर की तुलना एनयूएलएल की तुलना में एक चेतावनी उत्पन्न क्यों करती है?
- 23. CUDA: लॉजिकल ऑपरेटरों की तुलना में कभी-कभी बिटवाई ऑपरेटर क्यों तेज होते हैं?
- 24. क्या लिंक तेज, धीमा या वही है?
- 25. कैप्चरिंग से लुकहेड (कभी-कभी) तेज क्यों है?
- 26. PHP: जेएसओएन या एक्सएमएल पार्सर तेज है?
- 27. स्ट्रिंग/टेक्स्ट के रूप में संग्रहीत तारीखों की तुलना सीधे तुलना की जा सकती है?
- 28. क्या जेपीईजी की तुलना में तेज़ हानिकारक संपीड़न है?
- 29. पाइथन में अतिरिक्त से अधिक घटाव क्यों तेज है?
- 30. कौन सा "अगर" निर्माण तेज है - कथन या टर्नरी ऑपरेटर?
वाह - मैं नहीं किया है कृपया थोड़ी देर बाद मैथ्यू विल्सन की वेबसाइट के लिए किया गया - लगता है कि वह एक व्यस्त पिछले कुछ महीनों के लिए किया था है ... –
FastFormat परीक्षण पक्षपातपूर्ण हैं। कोड डाउनलोड करने पर, आप देखेंगे कि snprintf() बेंचमार्क Fastformat_util_snprintf() नामक फ़ंक्शन को कॉल करते हैं, जिसमें कुछ रैपर कोड शामिल होते हैं जो शायद परीक्षण को फेंक देते हैं। लेकिन आप सही हैं, शायद मेमोरी प्रबंधन शायद ओस्ट्रिंगस्ट्रीम धीमा कर देता है। – Max
कोड को देखने के लिए धन्यवाद। मैंने केवल सुंदर ग्राफ को देखा था। –