我注意到,在我编写的任何程序中,如果我在监视器上进行大量打印(即printf
或fprintf (stderr, "...")
),执行时间会明显变慢。
我认为由于磁盘的物理限制,写入磁盘会很慢。我不确定为什么打印到屏幕会显着减慢程序速度。
写入终端并不是很快,也不是为了快速而设计的,因为通常进入标准输出的唯一内容是用户的信息片段,用户受他或她阅读内容的速度限制。
当您在例如终端上写信时。linux,会发生以下事情(也许)。在每两个连续步骤之间调用内核:
这些步骤很多......由于终端输出通常只是行缓冲,所以这种情况经常发生。
根据屏幕的类型、大小、显卡或任何输出经过,是的,打印内容会显着增加执行时间。很可能打印到磁盘实际上更快 - 磁盘每秒可能需要几兆字节(理论上在现代 SATA 驱动器上大约 300-600MB/s,但实际上,迟早会比这慢,因为磁盘实际上需要将数据移动到磁盘内的盘片上——但它们也有很大的缓存,因此写入 16MB 或 32MB 可能需要相当长的时间)。尝试在您的代码中添加一些时间戳(如果您还没有)并myprog
与myprog > file
和比较myprog > /dev/null
(或NUL:如果你是Windows),看看哪个需要更多时间——我敢打赌它是进入屏幕的那个——写入空设备是最快的,但只有一点点。
打印到屏幕的最大问题是滚动 - 这意味着“随机播放所有内容”,即使使用聪明的硬件,也可能需要相当多的像素来随机播放。请记住,现代显卡更倾向于绘制 3D,这与滚动 2D 文本屏幕的方式完全不同。
当然,最重要的是,您的应用程序本身需要更多时间,因为您正在调用 printf 或类似的函数,这些函数并不完全是微不足道的函数,因此如果您打印很多东西, printf 本身需要一些时间 - 对于程序使用简单的代码,这可能是完成实际工作所需时间的 10 倍,即使数据变为“null”。
printf() 通常在打印到屏幕(终端)时进行行缓冲,这会使输出变慢。
您可以设置stdout
使用setvbuf()的缓冲区大小。