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

时间:2015-09-16 02:10:34

标签: java performance memory-management jvm java-8

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

1 个答案:

答案 0 :(得分:3)

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

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

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