System.out.print导致延迟?

时间:2016-04-25 14:18:40

标签: java printing latency

我从Java编程书中得到了一个简单的程序,只是添加了一些。

package personal;

public class SpeedTest {
  public static void main(String[] args) {
    double DELAY = 5000;
    long startTime = System.currentTimeMillis();
    long endTime = (long)(startTime + DELAY);
    long index = 0;

    while (true) {
      double x = Math.sqrt(index);
      long now = System.currentTimeMillis();
      if (now >= endTime) {
        break;
      }
      index++;
    }
    System.out.println(index + " loops in " + (DELAY / 1000) + " seconds.");
  }
}

这会返回128478180 loops in 5.0 seconds.

如果我在if语句之前添加System.out.println(x);,那么我在5秒内的循环次数会下降到400,000次,这是由于System.out.println()的延迟吗?或者只是在我没有打印出来时x没有被计算出来?

1 个答案:

答案 0 :(得分:0)

任何时候你在一个非常繁忙的循环中“输出”,用任何编程语言,你会引入两个可能非常重要的延迟:

  1. 必须将数据转换为可打印字符,然后将其写入可能出现的任何显示/设备......并且......
  2. “输出任何内容的行为”迫使流程将自身与可能也会产生输出的任何其他流程同步。
  3. 通常用于此目的的一种替代策略是“跟踪表”。这是一个固定大小的内存中数组,它包含字符串。条目以“循环”方式添加到此表中:最旧的条目不断被最新条目替换。此策略提供历史记录而不需要输出。(唯一的要求是,任何向表中添加条目或从中读取条目的人必须同步其活动例如使用互斥锁。)

    希望显示 trace-table内容的进程应该获取互斥锁,制作感兴趣内容的内存副本,然后在准备输出之前释放互斥锁。通过这种方式,为跟踪表提供条目的各种进程不会被与I / O相关的延迟源延迟。