我正在 Java 程序中进行 100 的对数和幂计算。第二次开始所花费的时间(使用 System.nanotime())比第一次快得多。为什么? Java(我使用 JDK8)是否使用任何内存缓存进行数学计算?
最佳答案
在第一次数学计算时,JVM 至少需要将 Math
类从硬盘驱动器加载到内存中,验证它(扫描错误)并解析它以提取方法、注释、等。它比计算对数慢得多。因此,第一次访问该类可能比后续访问慢很多倍。
在进一步的迭代中,可以触发代码的 JIT 编译(所谓的堆栈替换)并且将编译您的测试方法,因此您可能会获得更快的速度,因为调用 Math 方法会很简单被 CPU 指令取代,减少了将参数传递给 native 代码的开销以及解释器在迭代时的工作。此外,如果您的测试写得不好并且您不使用计算结果,JIT 编译器可能会完全删除对 Math 库的调用。
最后,对于像 Math.log
这样快速的方法,纳米时间可能会产生过于不精确的结果。考虑写适当的 JMH benchmark .
关于java - JVM 如何从第二次开始更快地执行数学计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598624/