我在Java程序中进行了100次对数和幂计算。第二次开始时间(使用System.nanotime())比第一个实例快。为什么? Java(我使用JDK8)是否使用任何内存缓存进行数学计算?
答案 0 :(得分:3)
在第一次数学计算时,JVM至少需要将Math
类从硬盘驱动器加载到内存中,验证它(扫描错误)并解析它以提取方法,注释等。它是比计算对数慢得多。因此,第一次访问该类可能比后续访问慢很多倍。
在进一步的迭代过程中,可以触发代码的JIT编译(所谓的堆栈替换),并且您的测试方法将被编译,因此您可以更加快速地调用Math方法被CPU指令替换,减少了将参数传递给本机代码的开销以及解释器迭代工作。此外,如果您的测试写得不好并且您没有使用计算结果,那么JIT编译器可能会删除对Math库的调用。
最后对于像Math.log
这样的快速方法,纳米时可能会产生太不精确的结果。考虑写一些正确的JMH benchmark。