jvm - 为什么 JVM 在启动时随着时间的推移执行相同的程序会更快?

标签 jvm java

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

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

最佳答案

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

这仅反射(reflect)了一个普遍事实,即您用来测试性能的技术在 Java 中根本不可靠。

关于jvm - 为什么 JVM 在启动时随着时间的推移执行相同的程序会更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736345/

相关文章:

java - Android:BitmapFactory.decodeByteArray - 降低图像质量

java - 编辑castorbuilder.properties文件

java - 通过修改对象头掩码字中的位来固定对象

java - JVM 基准测试应用程序

java - 了解 Java 垃圾收集中的足迹测量

scala - Scala 是否在 JamVM 上运行

java - 如何排除/重定向 web.xml 或 Guice servlet 模块中的某些 url 模式?

java - Spring security 在 PreAuthorize 中使用 hasPermission,仅使用一个参数

java - EqualsIgnoreCase() 未按预期工作。

java - Android studio 不自动导入java头