2012-03-11 14 views
9

संभव डुप्लिकेट:
C++: “std::endl” vs “\n”बफर फ्लशिंग: " n" बनाम std :: endl

में त्वरित सी ++, दो चीजों का उल्लेख कर रहे:

  1. अधिकांश सिस्टम आउटपुट डिवाइस में वर्ण लिखने के लिए काफी समय लेते हैं। इस वजह से, सी ++ एक बफर में लिखे जाने वाले अक्षरों को जमा करता है और बफर को फ़्लश करने की प्रतीक्षा करता है।

  2. एक तरीका एक बफर फ़्लश किया जा सकता है अगर हम इसे स्पष्ट रूप से std::endl का उपयोग करके ऐसा करने के लिए कहते हैं। जाहिर है लाभ होगा बहुत छोटे और unnoticeable आउटपुट का सबसे बड़ा है, लेकिन "\n"std::endl का उपयोग कर से अधिक तेजी से उपयोग कर रहा है, या "\n" भी एक बफर फ्लश करता है के अलावा सब कुछ के लिए:

यह मैं आश्चर्य बनाया?

+3

क्या आपने इसे मापने की कोशिश की? –

+1

हां, यह एक कार्यान्वयन विस्तार है, इसलिए आपको एक निश्चित उत्तर नहीं मिलेगा। मेरा अनुमान है कि यह अधिकांश कार्यान्वयन में एक फर्क पड़ता है, लेकिन यह सच नहीं होना चाहिए। –

+0

@ करल - मान लीजिए, मैंने नहीं किया, मैं यह भी नहीं जानता कि कैसे करें। मैं किताब पढ़ रहा था और मैं उत्सुक था, इसलिए मैंने सोचा कि मैं पूछूंगा। –

उत्तर

8

'\ n' का उपयोग करके बफर को फ्लश नहीं करता है और वास्तव में std :: endl का उपयोग करने से तेज़ है।

ठेठ I/O में, आउटपुट को इच्छित डिवाइस पर लिखे जाने से पहले buffered किया जाता है। इस तरह, जब डिवाइस तक पहुंचने के लिए धीमा करने के लिए लिखते हैं (फ़ाइलों की तरह), तो प्रत्येक चरित्र के बाद डिवाइस तक पहुंच नहीं है। डिवाइस पर बफर को "फ्लश" फ्लश करना, एक निश्चित प्रदर्शन ओवरहेड का कारण बनता है।

-Adapted से: C++ - endl and flushing the buffer

+1

कुछ [आम तौर पर] "तेज़" के बहुत छोटे मूल्य के लिए ;-) –

+2

@pst: ठीक है, फ़ाइल को बड़ी मात्रा में डेटा आउटपुट करने पर यह वास्तव में प्रदर्शन को मार सकता है (यह डेटा के कुछ दसियों लिखते समय मेरे साथ हुआ सीएसवी में)। –

+0

@MatteoItalia True, मैं उलटा नहीं सोच रहा था :( –

0

मैं जोड़ने के लिए है कि मैं धारा को '\n' लिखने के अर्थ लगता है कि तीसरे पक्ष के पुस्तकालयों में std::endl/std::flush लिखने से अलग हो सकते हैं करना चाहते हैं।

उदाहरण के लिए, मैं वर्तमान प्रोजेक्ट में ओस्ट्रीम-आधारित लॉगर का उपयोग कर रहा हूं। वह लॉगर आउटपुट स्वरूपण के लिए std::stringstream कार्यक्षमता का उपयोग करता है, लेकिन फ्लशिंग के लिए मैनिपुलेटर्स को ओवरराइड किया गया है। यह कोड को फ्लश करने और सरल बनाने के बिना '\n' को लॉग में लिखने की अनुमति देता है।

class MyStream 
{ 
    // [cut] 
    std::stringstream m_buffer; 
    // [cut] 
}; 

// friends: 
template <typename Printable> 
MyStream& operator<<(MyStream& stream, const Printable& value) 
{ 
    stream.m_buffer << value; 
} 

typedef decltype(std::flush) TManipulator; 
template <> 
MyStream& operator<<(MyStream& stream, const TManipulator& manipulator) 
{ 
    if (manipulator == std::flush || manipulator == std::endl) 
     stream.sendLogLine(); 
    else 
     stream.m_buffer << manipulator; 
} 

// usage sample 
void main() 
{ 
    getLoggerStream() << "hello" << std::endl; 
} 

पी.एस.:

यहाँ एक स्यूडोकोड नमूना है मैं std::stringstream उपclass नहीं करना चाहता था, इसलिए MyStream एक एडाप्टर है। अगर मैं '\n' फ्लशिंग करना चाहता हूं तो मुझे char*, std::string और अन्य विशेषज्ञताओं सहित अधिक कार्यक्षमता को दोबारा कार्यान्वित करना चाहिए।

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