屏幕/标准输出的I / O.

时间:2012-12-25 15:41:13

标签: c io

我注意到在我编写的任何程序中,如果我对显示器进行大量打印(即printffprintf (stderr, "...")),执行时间会明显变慢。

我认为由于磁盘的物理限制,写入磁盘的速度会很慢。我不确定为什么打印到屏幕会显着减慢程序。

3 个答案:

答案 0 :(得分:3)

写入终端的速度并不快,并且设计得不够快,因为通常只有stdout的内容就是那些受到他或她读取内容速度限制的用户的信息。

当您在终端上写信时。 linux,发生以下事情(也许)。在每两个连续步骤之间调用内核:

  1. 您的程序发出写入系统调用以写入数据。
  2. 内核恢复终端仿真器并生成写入终端设备的数据
  3. 终端仿真器呈现其帧的新状态并将其发送到X服务器
  4. X服务器操纵内存映射显示区域
  5. 内核告诉您的显卡交换缓冲区
  6. 这些步骤很多......由于终端输出通常只是行缓冲,所以这种情况经常发生。

答案 1 :(得分:3)

根据屏幕的类型,屏幕的大小,显卡或输出的任何内容,是的,打印内容可以为执行时间增加大量时间。打印到磁盘很可能实际上更快 - 磁盘每秒可能需要几兆字节(理论上在现代SATA驱动器上大约需要300-600MB / s,但实际上,迟早它会比磁盘慢,因为磁盘实际上需要将数据移动到磁盘内的盘片上 - 但它们也有大型缓存,因此写入16MB或32MB可能需要相当长的时间)。尝试在代码中添加一些时间戳(如果还没有)并将myprogmyprog > filemyprog > /dev/null进行比较(或NUL:如果您是Windows),并查看哪一个需要更多时间 - 我打赌它是进入屏幕的那个 - 写入空设备是最快的,但只是一点点。

打印到屏幕的最大问题是滚动 - 它意味着“随机播放”,即使使用巧妙的硬件,也可能会有相当多的像素进行随机播放。请记住,现代图形卡更倾向于绘制3D,这与滚动2D文本屏幕的方式完全不同。

当然,最重要的是,你的应用程序本身需要更多的时间,因为你正在调用printf或类似的函数,这些函数并不是完全无关紧要的,所以如果你打印很多东西,printf本身需要一些时间 - 对于具有简单代码的程序,这可以是实际工作所需时间的10倍,即使数据变为“空”。

答案 2 :(得分:2)

printf()通常在打印到屏幕(终端)时进行行缓冲,这会使输出变慢。

您可以使用 setvbuf() 设置stdout的缓冲区大小。