2010-01-23 7 views
8

इस कार्यक्रम:एंडल को " n" के पर्याय के रूप में क्यों उपयोग किया जाता है, भले ही यह महत्वपूर्ण प्रदर्शन दंड का कारण बनता है?

#include <iostream> 
#include <cstdlib> 
#include <string> 

int main(int argc, const char *argv[]) 
{ 
    using ::std::cerr; 
    using ::std::cout; 
    using ::std::endl; 

    if (argc < 2 || argc > 3) { 
     cerr << "Usage: " << argv[0] << " [<count>] <message>\n"; 
     return 1; 
    } 
    unsigned long count = 10000; 
    if (argc > 2) { 
     char *endptr = 0; 
     count = ::std::strtoul(argv[1], &endptr, 10); 
     if ((argv[1][0] == '\0') || (*endptr != '\0')) { 
     cerr << "Usage: " << argv[0] << " [<count>] <message>\n"; 
     return 1; 
     } 
    } 
    const ::std::string msg((argc < 3) ? argv[1] : argv[2]); 
    for (unsigned long i = 0; i < count; ++i) { 
     cout << i << ": " << msg << '\n'; 
    } 
    return 0; 
} 

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

$ time ./joe 10000000 fred >/dev/null 

real 0m15.410s 
user 0m10.551s 
sys 0m0.166s 

वास्तविक समय पर अमल करने की 15.4 सेकंड लेता है। इस के साथ उत्पादन लाइन बदलें: cout << i << ": " << msg << endl; और आप कुछ इस तरह के साथ अंत:

$ time ./joe 10000000 fred >/dev/null 

real 0m39.115s 
user 0m16.482s 
sys 0m15.803s 

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

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

को देखते हुए यह, क्यों लोगों के लिए '\n'?

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

+0

क्या आप मुझे बता सकते हैं कि मानक के कौन सा हिस्सा सभी प्लेटफॉर्म पर आउटपुट समान होगा? – Glen

+2

देखें: http://stackoverflow.com/questions/213907/c-stdendl-vs-n –

उत्तर

21

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

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

+2

आप जानते हैं, आप पहले व्यक्ति हैं जिन्होंने वास्तविक उत्तर दिया है। :-) प्रमुख प्रश्न पूछना आपको इस साइट पर कहीं भी नहीं मिलता है। मुझे उन प्रश्नों को बताने का एक बेहतर तरीका ढूंढना है जिन्हें मैं निर्देशक होना चाहता हूं। – Omnifarious

+0

मैंने ऐसा भी एक वास्तविक उत्तर दिया, जैसा कि होता है। आप निश्चित रूप से इसके साथ सहमत नहीं हो सकते हैं। –

+0

@ नील बटरवर्थ, ओह, ठीक है। हां, चार्ल्स एक वास्तविक उत्तर देने वाला दूसरा व्यक्ति है। :-) आपका भी है। – Omnifarious

0

असली सवाल यह है कि कंपाइलर ने ऐसे संस्करण कुत्ते को अंत संस्करण को संकलित करने का नाश्ते क्यों बनाया? यदि वे एक ही अर्थशास्त्र के लिए गारंटीकृत हैं, तो उनके पास एक ही रनटाइम होना चाहिए।

संपादित करें: जाहिर है, मुझे पता नहीं था कि एंडल ने धारा को फहराया ... यही वह है जो आपको इसे देखने के लिए नहीं मिलता है।

+2

वे समान अर्थशास्त्र रखने की गारंटी नहीं देते हैं। –

+0

वे वास्तव में, वास्तव में एक ही अर्थशास्त्र नहीं है। – Omnifarious

+0

ठीक है, वे कर सकते हैं, वे सिर्फ सी ++ मानक द्वारा गारंटी नहीं है। –

4

हर कोई प्रदर्शन के बारे में इतना परवाह नहीं करता है। कुछ अनुप्रयोगों के लिए, धारा की गारंटी दी जाती है और अधिक महत्वपूर्ण है।

संपादित करें: इसके अलावा, मैं से '\n' :-)

+0

लगभग किसी भी मामले में जहां मैं 'endl' का उपयोग करता हूं, क्या वास्तव में कोई फर्क नहीं पड़ता कि स्ट्रीम सही और फिर वहां फिसल जाती है। :-) – Omnifarious

+0

लॉगिंग अनुप्रयोग, नेटवर्क संचार और डेटाबेस तुरंत दिमाग में आते हैं। –

+0

लोगों को लॉगिंग के लिए ':: std :: cerr' या कुछ अन्य अनबफर स्ट्रीम का उपयोग करना चाहिए। मैंने कभी भी एक गंभीर नेटवर्क एप्लिकेशन या डेटाबेस नहीं देखा है जो नेटवर्क पर संचार के लिए iostreams का उपयोग करता है या डेटाबेस में लिखता है। – Omnifarious

4

AFAIK, endl भी धारा है, जो प्रदर्शन दंड के कारण हो सकता है flushes टाइप करने के लिए endl आसान लगता है।

+0

आप सही हैं। std :: endl आउटपुट बफर flushes, और "\ n" नहीं करता है। –

+0

मुझे पता है कि प्रदर्शन दंड क्यों मौजूद है। :-) मेरा सवाल है: ':: std :: endl' अभी भी" क्या किया गया है "क्यों है, भले ही उसके पास प्रदर्शन दंड है? – Omnifarious

+1

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

2

मैं स्ट्रिंगस्ट्रीम पर एंडल का उपयोग करता हूं क्योंकि यह लापता लाइनब्रेक को स्पॉट करना आसान बनाता है।

2

मेरा अनुमान है कि निर्देशक ग्रंथ std::endl का उपयोग इस विश्वास के साथ करते हैं कि यह शुरुआती लोगों के लिए सरल और कम भ्रमित है, और बाद में लोग इसका उपयोग करने के आदी हो गए।

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