java - JVM 如何从第二次开始更快地执行数学计算?

标签 java performance memory-management jvm java-8

我正在 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/

相关文章:

python - 哪个更快 np.vstack、np.append、np.concatenate 或在 cython 中制作的手动函数?

ios - 如何在非ARC模式下手动释放此静态变量

c++ - 我应该如何修复 valgrind 的未初始化值错误?

java - 开启以数字开头的双字符字符串

java - java.util.priorityqueue是如何实现的?

java - 在 Java 中将 Firestore 中的字符串保存到 ArrayList 中

python - 具有迭代器依赖性的矩阵乘法 - NumPy

c - 适当的内存分配?

java - 无法让 findAll 在 Elasticsearch 中工作

java - 单击进度对话框按钮后如何关闭 Activity