c++ - Why does endl get used as a synonym for "\n" even though it incurs significant performance penalties? -


यह प्रोग्राम:

  #include & lt; iostream & gt; # शामिल करें & lt; cstdlib & gt; #include & lt; स्ट्रिंग & gt; Int main (int argc, const char * argv []) {का प्रयोग :: std :: cerr; का प्रयोग :: std :: cout; :: std :: endl का उपयोग कर; अगर (argc & lt; 2 || argc & gt; 3) {cerr & lt; & lt; "उपयोग:" & lt; & lt; Argv [0] & lt; & lt; "[& Lt; गिनती & gt;] & lt; संदेश & gt; \ n"; वापसी 1; अहस्ताक्षरित लंबी गणना = 10000; If (argc & gt; 2) {char * endptr = 0; Count = :: std :: strtoul (argv [1], और endptr, 10); अगर ((आरजीआर [1] [0] == '\ 0') || (* अंतःप्रेटर! = '\ 0')) {cerr & lt; & lt; "उपयोग:" & lt; & lt; Argv [0] & lt; & lt; "[& Lt; गिनती & gt;] & lt; संदेश & gt; \ n"; वापसी 1; }} Const :: std :: string msg ((argc & lt; 3)? Argv [1]: argv [2]); (अहस्ताक्षरित लंबे मी = 0; i & lt; गिनती; ++ i) {cout & lt; & lt; मैं & lt; & lt; ":" & Lt; & lt; Msg & lt; & lt; '\ N'; } वापसी 0; }  

जब ऐसा समय समाप्त होता है:

  $ समय ./joe 10000000 फ़्रेड & gt; / dev / null असली 0m15.410s उपयोगकर्ता 0m10.551s sys 0m0 .166s  

निष्पादित करने के लिए वास्तविक समय का 15.4 सेकंड लेता है। इसके साथ आउटपुट लाइन को बदलें: cout & lt; & lt; मैं & lt; & lt; ":" & Lt; & lt; Msg & lt; & lt; एंडल; और आप इस तरह से कुछ के साथ समाप्त होते हैं:

  $ समय ./joe 10000000 फ़्रेड & gt; / dev / null असली 0m39.115s उपयोगकर्ता 0m16.482 ss 0m15.803s  

जैसा कि आप देख सकते हैं, समय दोगुने से अधिक चलाने के लिए, और ओएस में समय का लगभग आधा खर्च करने के लिए प्रोग्राम ओएस में कम समय बिताने से चला जाता है।

कार्यक्रम के दोनों संस्करणों में समान आउटपुट होते हैं, और प्रत्येक प्लेटफ़ॉर्म पर एक समान आउटपुट होने के लिए मानक द्वारा गारंटी दी जाती है।

यह देखते हुए, लोग endl '\ n'?

संपादित करें: के लिए एक पर्याय के रूप में यदि यह स्पष्ट नहीं है, तो यह प्रश्न एक प्रमुख प्रश्न बनना है और यहां शिक्षण उद्देश्यों के लिए है मुझे पता है कि प्रदर्शन जुर्माना क्यों मौजूद है।

मैं निश्चित नहीं हूँ आउटपुट स्ट्रीम में std :: endl को सम्मिलित करना .widen ('\ n') सम्मिलित करने के बराबर के रूप में परिभाषित किया गया है और फिर flush () कॉल कर रहा है और अभी तक कई प्रोग्रामर std :: endl का उपयोग करने में बनी रहती हैं, भले ही कोई फ्लश नहीं होता, उदाहरण के लिए वे तुरंत कुछ और आउटपुट पर जाते हैं।

मेरी धारणा यह है कि यह एक गलत धारणा से आता है कि यह किसी तरह एक और पोर्टेबल है क्योंकि यह स्पष्ट रूप से एक विशिष्ट न्यूलाइन वर्ण का उपयोग नहीं करता है।

Comments

Popular posts from this blog

objective c - iPhone and it's wireless area -

unix - Listing all shared memory segments used by a process on AIX5.3+ -

tsql - Correct sql/hql query (aggregate in where clause) -