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" 在一个非常繁忙的循环中,在任何 任何 编程语言中,你都会引入两个可能非常重要的延迟:
- 数据必须转换为 printable 字符,然后写入任何 display/device 它可能要去的地方...和 ...
- "The act of outputting anything" 强制进程将自身与可能也正在生成输出的所有其他进程同步。
通常用于此目的的另一种策略是 "trace table." 这是一个 内存数组, 具有一定的固定大小,其中包含字符串。条目以 "round-robin" 的方式添加到此 table:最旧的条目不断被最新的条目替换。这个策略提供了一个 history 而不需要 output。(剩下的唯一要求是任何正在向 table 添加条目的人,或从中读取,必须同步它们的活动 e.g. 使用互斥锁。)
希望显示跟踪内容的进程-table应该获取互斥锁,在内存中复制感兴趣的内容,然后在准备输出之前释放互斥锁。这样,为跟踪table贡献条目的各种进程将不会被I/O-associated个延迟源延迟。
我从我的 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" 在一个非常繁忙的循环中,在任何 任何 编程语言中,你都会引入两个可能非常重要的延迟:
- 数据必须转换为 printable 字符,然后写入任何 display/device 它可能要去的地方...和 ...
- "The act of outputting anything" 强制进程将自身与可能也正在生成输出的所有其他进程同步。
通常用于此目的的另一种策略是 "trace table." 这是一个 内存数组, 具有一定的固定大小,其中包含字符串。条目以 "round-robin" 的方式添加到此 table:最旧的条目不断被最新的条目替换。这个策略提供了一个 history 而不需要 output。(剩下的唯一要求是任何正在向 table 添加条目的人,或从中读取,必须同步它们的活动 e.g. 使用互斥锁。)
希望显示跟踪内容的进程-table应该获取互斥锁,在内存中复制感兴趣的内容,然后在准备输出之前释放互斥锁。这样,为跟踪table贡献条目的各种进程将不会被I/O-associated个延迟源延迟。