我正在尝试比较pow(x,2.0)
和pow(x,2.0000001)
的效果,虽然2.0
会更快,但它们的速度相同。我甚至通过使用-Xint
参数运行jar来删除JIT优化。
知道为什么会这样,拜托? 非常感谢!
答案 0 :(得分:10)
尽管存在不公平的downvotes,但这个问题很有意义,因为它揭示了真正的JVM错误。
运行Oracle JDK时,Math.pow(x, 2.0)
的性能在JVM版本之间差异很大。
Math.pow
使用软件实现之前,即它简单地调用__ieee754_pow函数来模拟软件中的操作。它相当慢,但它确实有一个特殊情况y == 2. Math.pow
成为JVM内部,由JIT转换为FPU指令。但是,通过此优化,特殊情况已丢失,导致y == 2的性能回归,请参阅bug JDK-8029302。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