0

我写了一个简单的数独求解器。为了粗略测试我使用简单的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 不是问题,我什至将一些数据硬编码到程序中 - 前几个仍然慢。谜题的难度也不是问题,因为我尝试了不同的排列和配置难度,并且总是相同 - 前几个较慢。

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

4

3 回答 3

6

这是应该发生的。JIT 编译器会优化随着程序运行时间的延长而更频繁地调用的代码。

这仅反映了您用于测试性能的技术在 Java 中根本不可靠的一般事实。

于 2013-02-06T18:39:14.990 回答
2

在实践中,方法JIT在第一次调用时不会被编译JVM。对于每个方法,JVM维护一个call count,每次调用该方法时都会递增。解释一个方法,JVM直到它call count超过一个JIT compilation threshold。因此,经常使用 methods的是在启动compiled之后不久JVM,而较少使用 methods的是在很久以后编译,或者根本不编译。这JIT compilation Threshold有助于JVM快速启动。

因此, Java 程序中最繁忙的方法总是被最 积极地优化,从而在每次被程序调用时提高其执行速度。

是上述信息的来源。

于 2013-02-06T18:47:53.773 回答
1

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

于 2013-02-06T18:45:41.463 回答