gpt4 book ai didi

c++ - 为什么 ostringstream 比 ofstream 快

转载 作者:可可西里 更新时间:2023-11-01 15:38:20 26 4
gpt4 key购买 nike

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

  1. 直接一个一个写入ofstream

    ofstream file("c:\\test.txt");
    for (int i = 0; i < 10000; ++i)
    {
    file << data[i];
    }
  2. 先写入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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com