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

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

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

尽管存在不公平的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的性能回归,请参阅错误JDK-8029302 。
  • 这种性能回归已经在JDK 8u25和即将到来的7u80中得到修复。 由于JDK 8u25 Math.pow对所有值的运行速度足够快,但对于y == 2非常快。请参阅相关问题 。

PS使用不同版本的JDK在我的机器上100M调用Math.pow的大致时间(以秒为单位)。

  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