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

Tom*_*cek 5 java performance

我想比较的性能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版本之间的性能差异很大.

  • 在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来说速度非常快.请参阅相关问题.

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)

  • @MarkoTopolnik嗯,这是一个相当愚蠢的内在.我的意思是它没有抓住所有[JNI的东西](http://stackoverflow.com/a/24747484/3448419)(在这个意义上它是一个*"内在的"*),但它仍然必须成为一个本机调用仿真功能.在JDK7u40中它变成了一个*"真正的内在"*,即实现是用汇编语言编写的,并且被内联到调用者中.我更新答案更准确.谢谢你复习:) (2认同)