在通过插入运算符'<<'执行写操作时使用std :: stringbuf进行缓冲的效果

时间:2017-07-02 11:43:56

标签: c++ performance buffer fstream

我试图在执行对文件的写入时对手动缓冲(通过std::stringbuf)的影响进行基准测试,而不是插入操作符<<进行缓冲。

版本1(无手动缓冲)

此版本涉及在每次迭代时执行写入。

std::ofstream ofs;
ofs.open("output_file", std::ios::out);

for (int i = 0; i < 100000000; i++)
  ofs << "Hello world!\n";

时间: 2.83s用户1.14s系统28%cpu 13.918总计

版本2(带手动缓冲)

此版本在最终编写之前将整个数据缓存在std::string对象中。

std::string buffer;
std::ofstream ofs;
ofs.open("output_file", std::ios::out);

for (int i = 0; i < 100000000; i++)
  buffer.append("Hello world!\n");

ofs << buffer;

时间: 1.87s用户2.27s系统24%cpu 16.654总计

版本1和版本2的运行时间之间存在可观察到的差异,并且在不同的运行中观察到类似的行为。如果第二个版本只执行单个写操作而不是第一个多次写操作,那么第二个版本的结束速度是多少呢? 此结果也与previous question中公布的结果形成对比,但目前的情况略有不同。

1 个答案:

答案 0 :(得分:2)

它不“只执行一次写操作”;你没有考虑建立这个字符串的成本,这不是零。

您可能会发现buffer.reserve(100000000 * strlen("Hello world!\n"))对某些事情有帮助。