2009-01-15 10 views

उत्तर

25

std::ostringstream धीमी होने के लिए आवश्यक है, लेकिन लागू होने पर आमतौर पर धीमा होता है। FastFormat's website has some benchmarks

धाराओं के लिए मानक लाइब्रेरी डिज़ाइन snprintf से अधिक का समर्थन करता है। डिजाइन का विस्तार एक्स्टेंसिबल होना है, और protectedvirtual विधियों को सार्वजनिक रूप से उजागर तरीकों से बुलाया जाता है। यह आपको आश्वासन के साथ धारा वर्गों में से एक से प्राप्त करने की अनुमति देता है कि यदि आप protect एड विधि को अधिभारित करते हैं तो आपको वह व्यवहार मिल जाएगा जो आप चाहते हैं। मेरा मानना ​​है कि एक कंपाइलर virtual फ़ंक्शन कॉल के ऊपरी हिस्से से बच सकता है, लेकिन मुझे ऐसा करने वाले किसी भी कंपाइलर से अवगत नहीं है।

इसके अतिरिक्त, स्ट्रीम ऑपरेशंस अक्सर आंतरिक रूप से बढ़ने योग्य बफर का उपयोग करते हैं; जो अपेक्षाकृत धीमी स्मृति आवंटन का तात्पर्य है।

+0

वाह - मैं नहीं किया है कृपया थोड़ी देर बाद मैथ्यू विल्सन की वेबसाइट के लिए किया गया - लगता है कि वह एक व्यस्त पिछले कुछ महीनों के लिए किया था है ... –

+0

FastFormat परीक्षण पक्षपातपूर्ण हैं। कोड डाउनलोड करने पर, आप देखेंगे कि snprintf() बेंचमार्क Fastformat_util_snprintf() नामक फ़ंक्शन को कॉल करते हैं, जिसमें कुछ रैपर कोड शामिल होते हैं जो शायद परीक्षण को फेंक देते हैं। लेकिन आप सही हैं, शायद मेमोरी प्रबंधन शायद ओस्ट्रिंगस्ट्रीम धीमा कर देता है। – Max

+0

कोड को देखने के लिए धन्यवाद। मैंने केवल सुंदर ग्राफ को देखा था। –

0

यह काफी संभव है क्योंकि sprintf असेंबली में लिखे गए सीआरटी का हिस्सा है। ostringstream एसटीएल का हिस्सा है, और शायद थोड़ा और अधिक सामान्य रूप से लिखा गया है, और इसके साथ निपटने के लिए ओओपी कोड/ओवरहेड है।

+3

मैं बहुत दृढ़ता से शक किसी को संभवतः स्वपीड़न में एक अभ्यास के रूप में छोड़कर विधानसभा में _ever_ लागू किया 'sprintf' है (' timethis 'उपलब्ध वेब पर कहीं है)। यूनिक्स वी 6 पर वापस जाने के लिए, सी रनटाइम लाइब्रेरी स्वयं सी में लिखी गई है (सी में लिखने के लिए _impossible_ की एक छोटी मुट्ठी भर को छोड़कर, 'setjmp' की तरह)। – zwol

3

बिल्कुल यह कार्यान्वयन-विशिष्ट है।

लेकिन यदि आप वास्तव में जानना चाहते हैं, तो दो छोटे कार्यक्रम लिखें, और उनकी तुलना करें। आपको जो कुछ भी दिमाग में है उसके लिए आपको सामान्य उपयोग शामिल करने की आवश्यकता होगी, दोनों कार्यक्रमों को एक ही स्ट्रिंग उत्पन्न करने की आवश्यकता होगी, और आप समय की जानकारी देखने के लिए एक प्रोफाइलर का उपयोग करेंगे।

फिर आपको पता चलेगा।

0

एक कारण मुझे पता है कि कार्यों का printf परिवार संबंधित C++ फ़ंक्शंस (cout, cin, और अन्य धाराओं) से तेज़ है, बाद में टाइपशेकिंग करते हैं। चूंकि इसमें आमतौर पर अधिभारित ऑपरेटरों को कुछ अनुरोध शामिल होते हैं, इसमें कुछ समय लग सकता है।

वास्तव में, प्रोग्रामिंग प्रतियोगिताओं में अक्सर यह अनुशंसा की जाती है कि आप इस कारण से cout/cin के बजाय printf et al का उपयोग करें।

+3

इस प्रकार के टाइपकेकिंग के साथ-साथ ऑपरेटर ओवरलोड को संकलित समय में हल किया जाता है। कम रनटाइम प्रदर्शन उनके द्वारा समझाया नहीं गया है। –

+3

वास्तव में, printf() परिवार को रनटाइम पर प्रारूप को पार्स करना पड़ता है, जो अवलोकन – MSalters

+1

सी ++ टाइपशेकिंग से मेल नहीं खाता है रनटाइम लागत नहीं है। जब तक आप * संकलन * गति के बारे में बात नहीं कर रहे हैं, उस स्थिति में '' भयानक है। – Tom

8

कुछ लोग संभवतः आपको बताएंगे कि कार्य एक-दूसरे से तेज नहीं हो सकते हैं, लेकिन उनका कार्यान्वयन कर सकता है। यह सही है मुझे लगता है कि मैं सहमत होगा।

आपको कभी भी बेंचमार्क के अलावा किसी अंतर को देखने की संभावना नहीं है। सी ++ धाराओं आमतौर पर धीमे होने के कारण यह है कि वे अधिक लचीला हैं। लचीलापन अक्सर समय या कोड वृद्धि की लागत पर आता है।

इस मामले में, सी ++ धाराएं स्ट्रीम-बफर पर आधारित होती हैं। अपने आप में, धाराएं केवल पतवार होती हैं जो स्वरूपण और त्रुटि झंडे को जगह में रखती हैं, और सी ++ मानक लाइब्रेरी (उदाहरण के लिए, संख्याओं को मुद्रित करने के लिए num_put) के सही i/o कॉल करें, जो अंतर्निहित धारा में मानों को अच्छी तरह से स्वरूपित करती हैं -बफर सी ++ धारा से जुड़ा हुआ है।

ये सभी तंत्र - पहलू, और बफर, वर्चुअल फ़ंक्शंस द्वारा कार्यान्वित किए जाते हैं।जबकि वहाँ वास्तव में है कोई निशान ध्यान दें, उन कार्यों ग stdio पेंडेंट से कि तथ्य यह है उन्हें कुछ हद तक सामान्य रूप से ग stdio कार्यों का उपयोग कर की तुलना में धीमी कर देगा धीमी लागू किया जाना चाहिए (मैं benchmark'ed उस के साथ पहले जीसीसी/libstdC++ और में कुछ समय तथ्य ने एक मंदी देखी - लेकिन जिसे आप दिन-दर-दिन उपयोग में शायद ही कभी ध्यान देते हैं)।

1

एक मुद्दा शायद हो सकता है कि ostringstream से जोड़ा प्रकार सुरक्षा अतिरिक्त भूमि के ऊपर किया जाता है। हालांकि, मैंने कोई माप नहीं किया है।

8

हम 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 के समग्र प्रदर्शन के साथ बहुत खुश हूँ।

0

litb said के रूप में, मानक धाराओं बहुत सी बातें हम हमेशा की जरूरत नहीं है समर्थन करते हैं। कुछ धाराओं कार्यान्वयन इस इस्तेमाल कभी नहीं किया लचीलापन से छुटकारा पाने के, उदाहरण के लिए FAStream देखते हैं।

+0

FAStream के साथ क्या हुआ? मैंने मंच का उपयोग करके कुछ जवाब देखा है लेकिन अब मैं इसके बारे में कोई जानकारी नहीं ढूंढ पा रहा हूं। –

+0

हां मुझे नहीं पता। मुझे लगता है कि सबसे अच्छा अपने लेखक से सीधे पूछना है। –

0

हाँ, यदि आप विजुअल 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 
} 
संबंधित मुद्दे