要将许多数据写入文件,我有2种方法:

  • 直接一一写入ofstream
    ofstream file("c:\\test.txt");
    for (int i = 0; i < 10000; ++i)
    {
        file << data[i];
    }
    
  • 首先写入istringstream,然后立即写入ofstream
    ostringstream strstream;
    for (int i = 0; i < 10000; ++i)
    {
        strstream << data[i];
    }
    ofstream file("c:\\test.txt");
    file << strstream.str();
    

  • 毫不奇怪,第二种方法更快,实际上,它比我的HP7800机器上的第一种方法快4倍。

    但为什么?我知道ofstream在内部使用filebuf,而ostringstream在使用stringbuf-作为缓冲区,它们应该全部驻留在内存中,因此应该没有区别。

    引擎盖下有什么区别?

    最佳答案

    您是否在使用std::endl而不是'\n'std::endl有两件事:将'\n'插入流中,然后将缓冲区刷新到磁盘。我见过这样的代码会严重降低性能。 (修复该代码后,其运行速度提高了5到10倍。)
    刷新到字符串缓冲区比刷新到磁盘要快得多,因此可以解释您的发现。

    如果不是这种情况,您可能会考虑增加缓冲区大小:

    const std::size_t buf_size = 32768;
    char my_buffer[buf_size];
    ofstream file("c:\\test.txt");
    file.rdbuf()->pubsetbuf(my_buffer, buf_size);
    
    for (int i = 0; i < 10000; ++i)
    {
        file << data[i];
    }
    

    关于c++ - 为什么ostringstream比ofstream快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5192239/

    10-12 22:17