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