我正在编写一些控制台程序,我注意到有时当我使用print()并且我的程序处于空闲状态时,并不是所有内容都打印出来(最后几行都丢失了)。
最终会发生一些事情并且会打印出这些行,但是当我关闭程序时,最后几行不会出现。
所以我做了一些挖掘,看起来stdout缓冲区并不总是清空,除非满足某些条件(新行?/换行?)。
所以我创建了一个" myprintf()"包装printf以执行以下操作的函数(伪代码):
printf(...);
fflush(stdout);
问题是,除了显而易见的额外函数调用开销之外,这会降低我的程序速度吗?即这是一个明智的表演吗?
答案 0 :(得分:4)
是的,它会减慢速度。如果它没有,那么刷新将是默认行为。
根据你的帖子的语气来判断,听起来并不像你在做那些过多冲洗会引人注意的事情。因此,除非你说为什么你害怕减速,否则就要冲走。
答案 1 :(得分:4)
取决于几件事。
如果你的printf以换行符结尾(\n
),stdout
缓冲区将会立即刷新并直接显示所有内容。这是stdout
缓冲区的默认行为。因此,在这种情况下,再次冲洗确实会使您的程序减慢一点,尽管只是一小部分。
现在,如果你没有以换行符结束,stdout将不会自动刷新,你确实需要fflush来正确显示内容。然后它也会减慢程序,尽管只是一点点。
您可以通过将缓冲区标准输出设置为在刷新之前不等待换行来完全避免您的问题。这会使你的包装器多余像这样:
setbuf(stdout, NULL);
每当stdout
中有任何内容时,它都会保证会被刷新。这比您每次直接拨打fflush()
的效率稍高一些。
总之,除非您在非常严格的性能限制下运行,否则产生的开销可以忽略不计。
答案 2 :(得分:3)
是的,会有减速,不一定非常明显;但它会存在。
printf(); fflush();
的更好替代方案是使用setvbuf()
更改缓冲政策;致电setvbuf(stdout,NULL,_IONBF,0);
将确保每次写入stdout
都会直接刷新(优于每次明确调用fflush()
)。
答案 3 :(得分:2)
IO通常是最耗时的操作。所以不必要的刷新可能会减慢你的程序。但你应该对它进行两次研究,因为如果输出是一个终端,则在对新行进行封装或在读取之前(在同一终端上),flush是自动的。所以我能想象的唯一用例可能是:
.
或*
或...)以显示长度操作的进展。如果没有同花顺,就什么都看不见了tee
),同时希望进度立即显示在屏幕上