【发布时间】:2015-12-12 10:49:50
【问题描述】:
我正在 Java 程序中进行 100 次对数和幂计算。第二次开始所花费的时间(使用 System.nanotime())比第一次要快得多。为什么? Java(我使用 JDK8)是否使用任何内存缓存进行数学计算?
【问题讨论】:
-
除非你展示你的代码,这是一个非常理论的问题。
标签: java performance memory-management jvm java-8
我正在 Java 程序中进行 100 次对数和幂计算。第二次开始所花费的时间(使用 System.nanotime())比第一次要快得多。为什么? Java(我使用 JDK8)是否使用任何内存缓存进行数学计算?
【问题讨论】:
标签: java performance memory-management jvm java-8
在第一次数学计算时,JVM 至少需要将Math 类从硬盘驱动器加载到内存中,对其进行验证(扫描错误)并对其进行解析以提取方法、注释等。这要慢得多而不是计算对数。因此,对类的第一次访问可能比后续访问慢很多倍。
在进一步的迭代过程中,您的代码的 JIT 编译可以被触发(所谓的堆栈上替换)并且您的测试方法将被编译,因此您可能会获得更快的速度,因为对 Math 方法的调用只会简单被 CPU 指令取代,减少了将参数传递给本机代码的开销以及解释器在迭代上的工作。此外,如果您的测试写得不好并且您没有使用计算结果,JIT 编译器可能会完全删除对数学库的调用。
最后,对于像Math.log 这样的快速方法,纳米时间可能会产生过于不精确的结果。考虑写正确的JMH benchmark。
【讨论】: