C++ 缓冲区冲洗:“\";vs.std::endl

C++ 缓冲区冲洗:“\";vs.std::endl,c++,optimization,C++,Optimization,可能重复: 在加速C++中,有两个问题被提及: 大多数系统需要大量的时间将字符写入输出设备。正因为如此,C++积累了要写入缓冲区的字符,等待缓冲区被刷新。 刷新缓冲区的一种方法是使用std::endl显式地告诉它这样做 这让我想知道:很明显,除了最大的输出外,所有输出的好处都很小且不明显,但是使用“\n”比使用std::endl快,或者说“\n”还刷新缓冲区?使用“\n”不会刷新缓冲区,而且确实比使用std::endl更快 在典型的I/O中,输出在写入预期设备之前会被缓冲。这样,当写入到慢速访

可能重复:

<>在加速C++中,有两个问题被提及:

  • 大多数系统需要大量的时间将字符写入输出设备。正因为如此,C++积累了要写入缓冲区的字符,等待缓冲区被刷新。
  • 刷新缓冲区的一种方法是使用
    std::endl
    显式地告诉它这样做


  • 这让我想知道:很明显,除了最大的输出外,所有输出的好处都很小且不明显,但是使用
    “\n”
    比使用
    std::endl
    快,或者说
    “\n”
    还刷新缓冲区?

    使用“\n”不会刷新缓冲区,而且确实比使用std::endl更快

    在典型的I/O中,输出在写入预期设备之前会被缓冲。这样,当写入到慢速访问设备(如文件)时,它不必在每个字符之后访问设备。刷新将缓冲区“刷新”到设备上,造成一定的性能开销


    -改编自:

    我想补充一点,我认为在流中写入
    '\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;
    }
    
    classmystream
    {
    //[剪辑]
    std::stringstream m_缓冲区;
    //[剪辑]
    };
    //朋友们:
    模板
    
    MyStream&Operatories,这是一个实现细节,所以您不会得到明确的答案。我的猜测是,这在大多数实现中都会有所不同,但这并不一定是真的。@Carl——诚然,我没有,我甚至不知道如何做到这一点。我当时正在读这本书,我很好奇,所以我想我应该问一下。对于一些[通常]非常小的“更快”值——)@pst:嗯,当输出大量数据到文件时,它实际上可能会扼杀性能(有一次我在CSV中写入数十MBs的数据时遇到过这种情况)。@MatteoItalia True,我没有想到相反的情况:(@MatteoItalia:另一方面,iostream不是最快的输出方式,因此会有许多其他东西对性能产生负面影响。@SigTerm:iostreams的设计很糟糕,但在
    g++
    实现中,我发现它比C stdio稍快一些。