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

Effect of using std::stringbuf for buffering while performing a write via insertion operator '<<'

本文关键字:lt 插入 运算符 执行 stringbuf std 缓冲 使用      更新时间:2023-10-16

我正在尝试在执行文件写入时对运行时间的手动缓冲(通过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 的运行时间之间存在可观察到的差异,并且在不同的运行中观察到类似的行为。当第二个版本只执行一个写入操作而不是第一个写入多个写入时,它最终会变慢,这是怎么回事?
这个结果也与上一个问题中发布的结果形成鲜明对比,但是当前的情况略有不同。

它不是"只执行单个写入操作";您没有考虑构建该字符串的成本,该字符串不为零。

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