我正在一个Java程序中进行100倍的对数和幂运算。第二次使用System.nanotime()所花费的时间比第一个实例快得多。为什么?Java (我使用JDK8)是否使用内存中的缓存来进行数学计算?
发布于 2015-09-15 19:01:02
在第一次计算数学时,JVM至少需要将Math
类从硬盘驱动器加载到内存中,验证它(扫描错误)并解析它以提取方法、注释等。这比计算对数要慢得多。因此,对类的第一次访问可能比后续访问慢很多倍。
在进一步的迭代中,您的代码的JIT编译可以被触发(所谓的堆栈上替换),并且您的测试方法将被编译,因此您可能会有更快的速度,因为对Math方法的调用将被CPU指令所取代,从而减少了将参数传递给本机代码的开销,以及迭代时的解释器工作。另外,如果您的测试写得不好,并且没有使用计算的结果,JIT编译器可能会删除对数学库的调用。
最后,对于像Math.log
这样的快速方法,纳米时间可能会产生太不精确的结果。考虑编写适当的JMH基准。
https://stackoverflow.com/questions/32598624
复制