【问题标题】:increase buffer for cout为 cout 增加缓冲区
【发布时间】:2011-11-04 08:29:18
【问题描述】:

引用Does setbuf() affect cout?

我想增加缓冲区大小以提高 cout 的性能(它是 通常重定向到磁盘)

我能做到吗:

std::cout.rdbuf()->pubsetbuf(some_buffer, buffer_size);

还有

ios::sync_with_stdio(false);

这有意义吗?

编辑:我也在使用多个线程,所以我希望减少同步的需要。

【问题讨论】:

  • 您可以尝试并对其进行基准测试,看看它是否有意义。如果确实如此,它的实现非常具体。
  • std::cout 缓冲区已经设计为最适合您的系统。您不太可能获得更好的性能(但请尝试),即使您发现改进可能不会转化为其他系统,因为每个标准库都将调整到该系统(或更具体地说是文件系统)。

标签: c++ io buffer iostream stdio


【解决方案1】:

我会首先检查刷新次数,这将使任何更大的缓冲区大小无关紧要。

特别注意,如果你的代码中有很多 cout

作为最后的手段,在您尝试“优化”之前,先寻找根本原因,例如尝试 strace 或类似工具来查看实际发生的系统调用的数量。 (我希望这对您的问题有所帮助)。

只有,如果这一切都已经得到照顾,更大的缓冲区大小实际上可以帮助减少系统调用的数量。

cout 输出的另一个放缓是,它通常准备与多个线程同步输出,即使您只使用一个线程也是如此。这又会严重减慢 I/O,因为更大的缓冲区没有用处。

【讨论】:

  • <<endl 替换为非常很重要。
  • 是的,我正在使用多个线程,我希望这样可以减少同步,而无需手动添加队列。
  • @Didier Trosset,是的,我不使用 endl :P
  • 经过进一步测试,对于多线程的情况确实有点不同。大约 5%。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2013-05-04
  • 2019-08-06
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多