JVM 如何从第二次开始更快地执行数学计算?

How JVM executes math calculations faster second time onwards?

我正在 Java 程序中进行 100 的对数和幂计算。第二次开始所花费的时间(使用 System.nanotime())比第一次快得多。为什么? Java(我使用 JDK8)是否使用任何内存缓存进行数学计算?

在第一次数学计算时,JVM至少需要将Math class从硬盘加载到内存中,验证它(扫描错误)并解析它以提取方法,注释等。它比计算对数慢得多。因此,第一次访问 class 可能比后续访问慢很多倍。

在进一步的迭代中,可以触发代码的 JIT 编译(所谓的堆栈替换)并且将编译您的测试方法,因此您可能会比调用 Math 方法有更多的加速将简单地替换为 CPU 指令,减少将参数传递给本机代码的开销以及解释器在迭代时的工作。此外,如果您的测试写得不好并且您不使用计算结果,JIT 编译器可能会完全删除对 Math 库的调用。

最后,对于像 Math.log 这样快速的方法,纳米时间可能会产生过于不精确的结果。考虑写正确的 JMH benchmark.