3

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

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

4

3 回答 3

3

写入终端并不是很快,也不是为了快速而设计的,因为通常进入标准输出的唯一内容是用户的信息片段,用户受他或她阅读内容的速度限制。

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

  1. 您的程序发出写入系统调用来写入数据。
  2. 内核恢复您的终端模拟器并产生写入终端设备的数据
  3. 终端仿真器渲染其帧的新状态并将其发送到 X 服务器
  4. X 服务器操作内存映射的显示区域
  5. 内核告诉你的显卡交换缓冲区

这些步骤很多......由于终端输出通常只是行缓冲,所以这种情况经常发生。

于 2012-12-25T15:53:26.383 回答
3

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

打印到屏幕的最大问题是滚动 - 这意味着“随机播放所有内容”,即使使用聪明的硬件,也可能需要相当多的像素来随机播放。请记住,现代显卡更倾向于绘制 3D,这与滚动 2D 文本屏幕的方式完全不同。

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

于 2012-12-25T15:53:34.730 回答
2

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

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

于 2012-12-25T15:51:48.600 回答