C ++程序员应该经常使用std :: flush吗?

时间:2013-06-28 17:08:11

标签: c++

是否建议C ++程序员经常编写像

这样的行
std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush

换句话说,在没有endl的输出行中,为了以防万一,我们应该flush很多吗?或者这些天在大多数平台上不再需要这个了吗?

2 个答案:

答案 0 :(得分:17)

您的平均课程不需要经常冲洗。在某些情况下,冲洗是一种特殊情况:

  • 与人或其他系统交互:在等待输入之前刷新输出是明智的。
  • 休眠一段时间:在延长睡眠或等待之前进行刷新简化了日志文件的检查,使数据库在大多数时间保持一致等等。

如果不需要缓冲,最好先禁用缓冲,而不是投入大量的冲洗。

大多数情况下,程序通过启用缓冲而受益。有时他们会在这里和那里产生一些角色。其他时候,他们输出了一线。

在我几十年的工程设计中,我最显着的性能提升通常只是通过改善缓冲来实现。有时通过将默认FILE缓冲区大小增加到512字节(默认值)到4K或32K(有时更高)。其他时候通过添加一层缓冲或缓存。通常,每次通过操作系统的i / o系统都会产生很高的开销。减少系统调用的总数(通常)是一种简单而高效的方案,可以提高性能。

答案 1 :(得分:14)

刷新通常不是最常进入的习惯,因为如果你不断写出IO,刷新有时可能会减慢程序的速度。您可以通过明确使用std::endlstd::flushstd::endl只需将\n插入流中,然后调用flush)来控制刷新方式。< / p>

@StackedCrooked in the C++ Lounge汇总了一项关于冲洗费用而不是冲洗费用的实验:http://coliru.stacked-crooked.com/view?id=55c830cf9a144559f31963de41fa9405-f674c1a6d04c632b71a62362c0ccfc51

重复使用后,非刷新功能相对较好,而每次调用时刷新都会增加一些开销:老实说,最好不要手动std::flush - 你的流。只需在程序结束时或在关键代码段结束后执行一次。

同样值得注意的是,您应该在对用户执行任何操作之前进行刷新,因此程序不会将内容写入用户应在日志文件或其他位置看到的输出。< / p>

编辑: 相关类比:In simple terms, what is the purpose of flush() in ostream