Java System.nanoTime经过的平均时间越来越小

时间:2012-03-15 17:25:25

标签: java jit jvm-hotspot nanotime

这不是我第一次遇到编程语言中的时钟时间问题。基本上我通过在while循环中调用函数来测量函数的运行速度。问题是,由于某种原因,while循环运行的时间越长,经过的时间越来越短。谁能解释一下?代码如下。

DescriptiveStatistics stats = new DescriptiveStatistics();
while(true) {
    long startTime = System.nanoTime();
    executeSaxonXsltTransformation();
    long stopTime = System.nanoTime();
    long elapsedTime = stopTime-startTime;
    stats.addValue((double)elapsedTime);
    System.out.println(stats.getN()+" - "+elapsedTime+ " - "+stats.getMean());
}

因此,在大约1,000次运行之后,经过的时间是750k到850k。但经过大约100,000次运行后,经过的时间降至580k至750k。通过观察平均值(stats.getMeans())可以最好地注意到持续减少,其中108k循环后平均值为〜632k,而3k循环平均值为~100万。切换到currentTimeMillis而不是nanoTime不会改变任何内容。

2 个答案:

答案 0 :(得分:7)

  

问题是,由于某种原因,while循环运行的时间越长,经过的时间越来越短。谁能解释一下?

这是您的热点 - 您运行代码的次数越多,优化程度越高。最终它会尽其所能,你会看到结果的稳定。

答案 1 :(得分:4)

这完全应该发生,因为Java的JIT优化了广泛运行的代码 - 运行得越多,JIT就越需要优化它。

如果您正在尝试进行基准测试,则应该通过在没有计时的情况下运行该方法几秒钟来“预热”基准测试,然后才开始执行计时。或者,你可以使用一个知道如何在Java中进行一致基准测试的库 - 加热JIT,获得准确的测量,无论你的方法是纳秒还是几秒 - 如Caliper