【问题标题】:How JVM executes math calculations faster second time onwards?JVM 第二次以后如何更快地执行数学计算?
【发布时间】:2015-12-12 10:49:50
【问题描述】:

我正在 Java 程序中进行 100 次对数和幂计算。第二次开始所花费的时间(使用 System.nanotime())比第一次要快得多。为什么? Java(我使用 JDK8)是否使用任何内存缓存进行数学计算?

【问题讨论】:

  • 除非你展示你的代码,这是一个非常理论的问题。

标签: java performance memory-management jvm java-8


【解决方案1】:

在第一次数学计算时,JVM 至少需要将Math 类从硬盘驱动器加载到内存中,对其进行验证(扫描错误)并对其进行解析以提取方法、注释等。这要慢得多而不是计算对数。因此,对类的第一次访问可能比后续访问慢很多倍。

在进一步的迭代过程中,您的代码的 JIT 编译可以被触发(所谓的堆栈上替换)并且您的测试方法将被编译,因此您可能会获得更快的速度,因为对 Math 方法的调用只会简单被 CPU 指令取代,减少了将参数传递给本机代码的开销以及解释器在迭代上的工作。此外,如果您的测试写得不好并且您没有使用计算结果,JIT 编译器可能会完全删除对数学库的调用。

最后,对于像Math.log 这样的快速方法,纳米时间可能会产生过于不精确的结果。考虑写正确的JMH benchmark

【讨论】:

  • 即使在解释执行中,第二次执行也可能快得多,因为 Oracle 的 JVM 在第一次遇到时会用非标准操作码替换某些数学方法的调用,因此后续执行甚至可以立即使用专门的 CPU 指令在解释器中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多