Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Math.pow(x,2.0)与Math.pow(x,2.0000001)的性能对比_Java_Performance - Fatal编程技术网

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

Java Math.pow(x,2.0)与Math.pow(x,2.0000001)的性能对比,java,performance,Java,Performance,我试图比较pow(x,2.0)和pow(x,2.0000001)的性能,我认为2.0会快得多,但它们的速度相同。我甚至通过使用-Xint参数运行jar来删除JIT优化 你知道为什么吗? 非常感谢 尽管有不公平的否决票,这个问题还是很有意义的,因为它揭示了真正的JVM缺陷 运行OracleJDK时,Math.pow(x,2.0)的性能因JVM版本而异 在JDK 7u40之前,Math.pow使用软件实现,也就是说,它只调用模拟软件中操作的函数。它相当慢,但它确实有一个y==2的特例 自从jdk7

我试图比较
pow(x,2.0)
pow(x,2.0000001)
的性能,我认为
2.0
会快得多,但它们的速度相同。我甚至通过使用
-Xint
参数运行jar来删除JIT优化

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

尽管有不公平的否决票,这个问题还是很有意义的,因为它揭示了真正的JVM缺陷

运行OracleJDK时,
Math.pow(x,2.0)
的性能因JVM版本而异

  • 在JDK 7u40之前,Math.pow使用软件实现,也就是说,它只调用模拟软件中操作的函数。它相当慢,但它确实有一个y==2的特例
  • 自从jdk7u40
    Math.pow
    成为JVM的内在特性,被JIT转换成FPU指令以来。但是,通过这种优化,特例已经丢失,导致y==2的性能回归,请参阅
  • JDK 8u25和即将推出的7u80中已经修复了这种性能退化。因为jdk8u25
    Math.pow对于所有值都足够快,但是对于y==2非常快。看
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      

实现可以自由地花费一个条件分支来测试特殊情况或使用相同代码实现所有情况。重要的是结果。没有关于执行时间的保证。(并非如此,如果你不小心,即使他们在那里,你也会看到他们)。你为什么期望性能提升?两个参数的类型都是
double
;它没有对整数幂使用任何特殊的魔法。如果你直接使用乘法(
x*x
),你会得到更好的结果。我期望得到更好的结果,因为Math.pow(x,y)的源代码有y==2的返回条件,正如你在这里看到的@TomášMocek,也许Math.pow(与你引用的StrictMath.pow相反)没有区分指数?当你说“Java实现”,您实际上是指本地方法,对吗?引用链接的JDK错误:
使用“-XX:+UnlockDiagnosticVMOptions-XX:+PrintIntrinsics“显示在这两种情况下都使用了内部实现。
因此,实际的更改仅在内部实现本身中,而不是在引入内部实现的事实中。@MarkoTopolnik嗯,这是一个相当愚蠢的内部实现。”。我的意思是,它没有爬过所有的部分(从这个意义上说,它是一个“内在的”),但它仍然必须对仿真函数进行本机调用。在JDK7u40中,它变成了“真正的内在”,即实现是在汇编中编写的,并内联到调用方中。我已经更新了答案,使之更加精确。感谢您的审阅:)