我写过一个简单的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不是问题,我甚至将一些数据硬编码到程序中 - 仍然先减慢一些。拼图的难度不是问题,我尝试了不同的排列和配置困难,总是一样 - 前几个都比较慢。
我的问题是 - 为什么会这样,有没有办法阻止它?
答案 0 :(得分:6)
假设发生。 JIT编译器优化了在程序运行更长时间内更频繁调用的代码。
这只反映了一个普遍的事实,即你用来测试性能的技术在Java中是不可靠的。
答案 1 :(得分:2)
在实践中,JIT
第一次调用方法时,JVM
不会编译方法。对于每个方法,JVM
维护一个call count
,每次调用该方法时都会增加JVM
。 call count
解释方法,直到其JIT compilation threshold
超过methods
。因此,在compiled
开始后不久,经常使用 JVM
methods
,使用率较低 JIT compilation Threshold
很晚才编译,或者根本不编译。这个JVM
有助于{{1}}快速启动。
因此,java程序的最繁忙的方法总是最优化的 aggresively ,每次程序调用时都会提高执行速度。
Here是以上信息的来源。
答案 2 :(得分:1)
在性能测试中,我们总是运行正在测试的系统一段时间才能使其达到稳定状态。只有这样我们才能启动绩效指标。您可以尝试相同的方法:在捕获指标之前多次运行solve()方法。