2012-03-11 12 views
9

可能性の重複:バッファフラッシュ: " n" は対のstd :: ENDL


    C++: “std::endl” vs “\n”

はC++、二つのことが記載されている加速

  • ほとんどのシステムでは、文字を出力デバイスに書き込むのにかなりの時間がかかります。このため、C++はバッファに書き込まれる文字を蓄積し、バッファがフラッシュされるのを待ちます。

  • バッファをフラッシュできる方法の1つは、std::endlを使用して明示的に指示する場合です。

  • は、これは私不思議製:明らかな利点は、出力の最大以外のすべてのために、小型で目立たない非常にだろうが、std::endlを使用するよりも"\n"速いを使用している、または"\n"もバッファをフラッシュしますか?

    +3

    これを試しましたか? –

    +1

    はい、これは実装の詳細なので、明確な答えは得られません。私の推測では、それはほとんどの実装で違いがありますが、これは真実である必要はありません。 –

    +0

    @Carl - 確かに、私はしなかった、私は方法を知らないだろう。私はその本を読んでいて好奇心が強いので、私は頼むと思った。 –

    答えて

    8

    '\ n'を使用するとバッファがフラッシュされず、実際にはstd :: endlを使用するよりも高速です。

    典型的なI/Oでは、出力は目的のデバイスに書き込まれる前にバッファされます。このように、デバイス(ファイルのような)にアクセスするのを遅くするために書いているときは、1文字ごとにデバイスにアクセスする必要はありません。フラッシングによりバッファがデバイスにフラッシュされ、パフォーマンスが大幅に低下します。

    -Adaptedから:C++ - endl and flushing the buffer

    +1

    いくつかの[一般的に]「高速」の非常に小さな値については、 –

    +2

    @pst:ファイルに大量のデータを出力すると、実際にパフォーマンスが低下することがあります(数十MBのデータを書き込むと、 CSVで)。 –

    +0

    @MatteoItalia True、私はその逆を考えていませんでした:( –

    0

    私はストリームに'\n'を書くの意味は、サードパーティのライブラリにstd::endl/std::flushを書くとは異なることができると思いことを追加したいと思います。

    たとえば、現在のプロジェクトでostreamベースのロガーを使用しています。そのロガーは出力フォーマットには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; 
    } 
    

    P.S.:ここ

    は、擬似コードのサンプルですstd::stringstreamをサブクラス化したくないので、MyStreamはアダプタです。 '\n'をフラッシングしたい場合は、char*std::stringなどの機能を実装する必要があります。

    関連する問題