使用 std::stringbuf 进行缓冲的效果,同时通过插入运算符'<<'执行写入
Effect of using std::stringbuf for buffering while performing a write via insertion operator '<<'
我正在尝试在执行文件写入时对运行时间的手动缓冲(通过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"))
对事情有所帮助。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 在未初始化映射的情况下,将值插入到映射的映射中
- 呼叫运营商<<临时
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 插入或删除时获取usb的dos_name
- <<操作员在下面的行中工作
- 叮叮当当在修复时插入多个"覆盖"说明符
- 链表c++插入,所有情况都已检查,但没有任何工作
- Visual C 构建器图案插入操作员`&lt;&lt;`样式