我想比较的性能pow(x,2.0)和pow(x,2.0000001)和我,虽然那2.0会快很多,但都是以相同的速度.我甚至通过运行带-Xint参数的jar来删除JIT优化.
知道为什么会这样吗,拜托?非常感谢!
apa*_*gin 10
尽管有不公平的downvotes,这个问题很有意义,因为它揭示了真正的JVM错误.
运行Oracle JDK时Math.pow(x, 2.0),JVM版本之间的性能差异很大.
Math.pow使用软件实现之前,它只是简单地调用__ieee754_pow函数来模拟软件中的操作.它相当慢,但确实有一个y == 2的特殊情况.Math.pow成为JVM内部,由JIT转换为FPU指令.但是,通过此优化,特殊情况已丢失,导致y == 2的性能回归,请参阅错误JDK-8029302.Math.pow对所有值的工作速度都足够快,但对于y == 2来说速度非常快.请参阅相关问题.PSMath.pow使用不同版本的JDK在我的计算机上进行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
Run Code Online (Sandbox Code Playgroud)