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

jno*_*cho 0 java jvm

我写了一个简单的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);
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Lou*_*man 6

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

这只反映了一个普遍的事实,即用于测试性能的技术在Java中并不可靠.

  • 不是从_very_开始.你可以让它更快地发生,但这实际上可能会减慢你的程序,因为它会优化其他不值得优化的代码.如果你想要可靠的性能指标,你可以做的最基本的事情是在你开始测量之前运行你的程序几秒钟的热身,但最好的办法是使用类似[Caliper]的东西(http:// caliper .googlecode.com)了解JVM并为您处理所有这些. (2认同)