0

这不是我第一次在编程语言中遇到时钟时间问题。基本上,我通过在 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 次运行后,经过的时间下降到 580,000 到 750,000。通过观察平均值 (stats.getMeans()) 可以最好地注意到持续下降,在 108k 循环之后,平均值约为 632k,而 3k 循环后平均值约为 100 万。切换到 currentTimeMillis 而不是 nanoTime 不会改变任何东西。

4

2 回答 2

7

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

这就是你的热点——你运行代码的次数越多,它就会越积极地优化。最终它会尽其所能,并且您会看到结果处于平稳状态。

于 2012-03-15T17:27:37.010 回答
4

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

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

于 2012-03-15T17:27:18.817 回答