jm1*_*890 4 c++ io buffer iostream stdio
我想增加缓冲区大小以提高cout的性能(通常会重定向到磁盘)
我可不可以做:
std::cout.rdbuf()->pubsetbuf(some_buffer, buffer_size);
Run Code Online (Sandbox Code Playgroud)
并且
ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
这有道理吗?
编辑:我也使用多个线程,所以我希望减少同步的需要。
我首先检查刷新次数,这将使任何更大的缓冲区大小变得无关紧要。
特别是看看,如果你的代码中有很多 cout << endl 并尝试用 cout << '\n' 代替它们,如果你不需要 endl 的刷新效果。
作为最后的手段,在尝试“优化”之前查找根本原因,例如尝试 strace 或类似工具来查看实际发生的系统调用数量。(我希望这对您的问题有帮助)。
只是,如果所有这些都已得到照顾,则更大的缓冲区大小实际上可以帮助减少系统调用的数量。
cout 输出的另一个减慢速度是,它通常准备与多个线程同步输出,即使您只使用一个线程。这又会严重减慢 I/O 速度,因为较大的缓冲区没有用处,因此会产生开销。