我有一个简单的程序,是从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.
如果我System.out.println(x);
在if语句之前添加,那么我在5秒钟内的循环次数将下降到40万次,这是由于延迟造成的System.out.println()
吗?还是只是x
在我不打印出来时才被计算出来?
无论何时以任何编程语言在非常繁忙的循环中“执行输出” ,都会引入两个可能非常重要的延迟:
通常用于此目的的一种替代策略是“跟踪表”。这是一个固定大小的内存数组,其中包含字符串。条目以“循环”方式添加到此表中:最旧的条目不断被最新的条目替换。此策略无需提供输出即可提供历史记录。(剩下的唯一要求是,向表添加条目或从中读取条目的任何人都必须同步其活动,例如使用互斥锁。)
希望显示跟踪表内容的进程应获取互斥锁,对感兴趣的内容进行内存复制,然后在准备输出之前释放互斥锁。这样,与跟踪表有关的条目的各种处理都不会被与I / O相关的延迟源所延迟。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句