小编典典

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

java

我正在尝试比较pow(x,2.0)和的性能,pow(x,2.0000001)尽管那2.0会快得多,但它们的速度相同。我什至通过运行带有-Xint参数的jar来删除JIT优化。

知道为什么吗?非常感谢!


阅读 221

收藏
2020-11-01

共1个答案

小编典典

尽管投票不公平,但这个问题还是有道理的,因为它揭示了真正的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的性能下降,请参见Bug 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
2020-11-01