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