2011-08-26 65 views
2

援引Does setbuf() affect cout?增加缓冲COUT

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

我可以这样做:

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

而且还

ios::sync_with_stdio(false); 

这是否有意义?

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

+0

您可以尝试一下并对其进行基准测试,看它是否合理。它的具体实现具体如果它确实。 – PlasmaHH

+0

std :: cout缓冲区已被设计为最适合您的系统。不太可能你会获得更好的性能(但请试试),即使你发现一个改进,这可能不会转化为其他系统,因为每个std库都将被调整到该系统(或更具体的文件系统)。 –

回答

4

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

特别是看看,如果你在你的代码< < ENDL有很多COUT的,并尝试通过COUT < <替换它们“\ n”来代替,如果你不需要ENDL的冲洗效果。

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

只有如果全部都已经被关注,更大的缓冲区大小实际上可以帮助减少系统调用的数量。

cout输出的另一个缓慢的问题是,即使只使用一个线程,通常也会准备将输出与多个线程同步。由于较大的缓冲区没有用处,开销会再次大幅减慢I/O。

+4

用<<'\ n''代替'<< endl'是非常重要的。 –

+0

是的,我正在使用多个线程,我希望这会减少同步,而无需手动添加队列。 – jm1234567890

+0

@Didier Trosset,是的,我不使用endl:P – jm1234567890