Java Math.pow(x,2.0)与Math.pow(x,2.0000001)的性能

时间:2015-03-23 19:55:26

标签: java performance

我正在尝试比较pow(x,2.0)pow(x,2.0000001)的效果,虽然2.0会更快,但它们的速度相同。我甚至通过使用-Xint参数运行jar来删除JIT优化。

知道为什么会这样,拜托? 非常感谢!

1 个答案:

答案 0 :(得分:10)

尽管存在不公平的downvotes,但这个问题很有意义,因为它揭示了真正的JVM错误。

运行Oracle JDK时,Math.pow(x, 2.0)的性能在JVM版本之间差异很大。

  • 在JDK 7u40 Math.pow使用软件实现之前,即它简单地调用__ieee754_pow函数来模拟软件中的操作。它相当慢,但它确实有一个特殊情况y == 2.
  • 由于JDK 7u40 Math.pow成为JVM内部,由JIT转换为FPU指令。但是,通过此优化,特殊情况已丢失,导致y == 2的性能回归,请参阅bug JDK-8029302
  • 此性能回归已在JDK 8u25和即将到来的7u80中得到修复。由于JDK 8u25 Math.pow对所有值的工作速度足够快,但y == 2的速度非常快。请参阅related question

P.S。使用不同版本的JDK在我的机器上调用Math.pow 100M的大致时间(秒)。

             Math.pow(x, 2.0)    Math.pow(x, 2.0000001)
JDK 7u25            3.0                30.4
JDK 7u40           11.1                11.1
JDK 8u40            0.1                11.1