为什么JVM在启动时会更快地执行相同的程序?

时间:2013-02-06 18:38:04

标签: jvm java

我写过一个简单的SUDOKU求解器。为了粗略测试性能,我正在使用简单的 System.currentTimeMillis 调用。

我在文本文件中准备了一组初始数据配置。程序读取文件并解决每个数独配置。在运行测试时,我注意到前3-4个解决方案的运行速度确实比其余的慢,而且速度越慢,意味着数量级。

有示例伪代码片段:

main(){
     while(file has lines){
         configuration = readLine();
         Solver s = new Solver(configuration);

         now1 = System.currentTimeMillis();
         s.solve();
         now2 = System.currentTimeMillis();

         System.out.print(now2 - now1);
     }
}

我只测量 solve()方法,所以IO不是问题,我甚至将一些数据硬编码到程序中 - 仍然先减慢一些。拼图的难度不是问题,我尝试了不同的排列和配置困难,总是一样 - 前几个都比较慢。

我的问题是 - 为什么会这样,有没有办法阻止它?

3 个答案:

答案 0 :(得分:6)

假设发生。 JIT编译器优化了在程序运行更长时间内更频繁调用的代码。

这只反映了一个普遍的事实,即你用来测试性能的技术在Java中是不可靠的。

答案 1 :(得分:2)

在实践中,JIT第一次调用方法时,JVM不会编译方法。对于每个方法,JVM维护一个call count,每次调用该方法时都会增加JVMcall count解释方法,直到其JIT compilation threshold超过methods。因此,在compiled开始后不久,经常使用 JVM methods使用率较低 JIT compilation Threshold很晚才编译,或者根本不编译。这个JVM有助于{{1}}快速启动。

  

因此,java程序的最繁忙的方法总是最优化的    aggresively ,每次程序调用时都会提高执行速度。

Here是以上信息的来源。

答案 2 :(得分:1)

在性能测试中,我们总是运行正在测试的系统一段时间才能使其达到稳定状态。只有这样我们才能启动绩效指标。您可以尝试相同的方法:在捕获指标之前多次运行solve()方法。