是否建议 C++ 程序员经常编写类似的行
std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush
换句话说,在没有 的输出行中endl
,我们是否应该经常使用flush
,以防万一?或者这些天在大多数平台上不再需要这个?
是否建议 C++ 程序员经常编写类似的行
std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush
换句话说,在没有 的输出行中endl
,我们是否应该经常使用flush
,以防万一?或者这些天在大多数平台上不再需要这个?
您的普通程序不需要频繁冲洗。冲洗更接近于在某些情况下需要的特殊情况:
如果不需要缓冲,最好首先禁用缓冲,而不是大量刷新。
大多数时候,程序通过启用缓冲而受益。有时它们会在这里和那里生成一些字符。其他时候,他们会输出一连串的线条。
在我几十年的工程生涯中,我最显着的性能提升通常是通过改进缓冲来实现的。有时通过将FILE
超过 512 字节(默认)的默认缓冲区大小增加到 4K 或 32K(有时更高)。其他时候通过添加一层缓冲或缓存。通常每次通过操作系统的 i/o 系统都会有很高的开销。减少系统调用的总数(通常)是提高性能的简单且高效的方案。
刷新通常不是最好的习惯,因为如果您经常向 IO 写入数据,刷新有时会减慢您的程序。std::endl
您可以通过显式使用或std::flush
(std::endl
只需将 a\n
插入流然后调用flush
)来控制刷新方式。
@StackedCrooked 在 C++ Lounge中进行了一项关于冲洗与不冲洗成本的实验:http ://coliru.stacked-crooked.com/view?id=55c830cf9a144559f31963de41fa9405-f674c1a6d04c632b71a62362c0ccfc51
重复使用后不刷新的效果相对较好,而每次调用它时刷新都会增加一些开销:老实说,最好不要手动std::flush
处理流。只需在程序结束时或代码关键部分结束后执行一次。
还需要注意的是,您可能应该在对用户执行任何操作之前刷新,因此程序不会将用户应该在日志文件或其他地方看到的输出写入内容。
编辑:相关类比:简单来说,ostream 中的 flush() 的目的是什么