System.out.print 导致延迟?

System.out.print causing 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.");
  }
}

这个returns128478180 loops in 5.0 seconds.

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

任何时候你 "do output" 在一个非常繁忙的循环中,在任何 任何 编程语言中,你都会引入两个可能非常重要的延迟:

  1. 数据必须转换为 printable 字符,然后写入任何 display/device 它可能要去的地方...和 ​​...
  2. "The act of outputting anything" 强制进程将自身与可能也正在生成输出的所有其他进程同步。

通常用于此目的的另一种策略是 "trace table." 这是一个 内存数组, 具有一定的固定大小,其中包含字符串。条目以 "round-robin" 的方式添加到此 table:最旧的条目不断被最新的条目替换。这个策略提供了一个 history 而不需要 output。(剩下的唯一要求是任何正在向 table 添加条目的人,或从中读取,必须同步它们的活动 e.g. 使用互斥锁。)

希望显示跟踪内容的进程-table应该获取互斥锁,在内存中复制感兴趣的内容,然后在准备输出之前释放互斥锁。这样,为跟踪table贡献条目的各种进程将不会被I/O-associated个延迟源延迟。