我试图在执行对文件的写入时对手动缓冲(通过std::stringbuf
)的影响进行基准测试,而不是插入操作符<<
进行缓冲。
此版本涉及在每次迭代时执行写入。
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总计
此版本在最终编写之前将整个数据缓存在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中公布的结果形成对比,但目前的情况略有不同。
答案 0 :(得分:2)
它不“只执行一次写操作”;你没有考虑建立这个字符串的成本,这不是零。
您可能会发现buffer.reserve(100000000 * strlen("Hello world!\n"))
对某些事情有帮助。