当前位置: 首页 > 面试题库 >

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

郑声
2023-03-14
问题内容

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

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


问题答案:

尽管投票不公平,但这个问题还是有道理的,因为它揭示了真正的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


 类似资料:
  • 问题内容: 我已经对Java中的x * x或Math.pow(x,2)更快进行了一些测试。我原本以为简单的x * x会更快一些,但是事实证明它的速度差不多相等。有人可以启发我吗,那怎么可能? 问题答案: 就您所知,它完全是JITted(甚至已经在编译时)了。由于没有真实的上下文,此类微基准很少会提供非常有用的结果。 绝对不是一个彼此优先的理由,因为现实世界中的代码很少有简单的操作作为性能热点。

  • 此方法将基数返回到指数幂,即基于幂指数。 语法 (Syntax) Math.pow(x, y) 参数 (Parameter) x - 代表基数 y - 代表指数 返回值 (Return Value) 返回指数幂的基数。 例子 (Example) console.log("---Math.pow()---") console.log("math.pow(2,3) : "+Math.pow(2,

  • 问题内容: 使用math.pow或**运算符哪个更有效?我什么时候应该使用另一个? 到目前为止,我知道可以返回一个或一个,如果您使用小数,该函数将返回一个浮点数 问题答案: 使用Power运算符将更快,因为它不会产生函数调用的开销。如果您反汇编Python代码,则可以看到以下内容: 请注意,我在这里使用变量作为指数,因为类似常数的表达式实际上是在编译时求值的。 现在,实际上,这种差异并不重要,正如

  • 问题内容: 我正在编写一个Java程序来计算将“我的唱歌的怪兽”中的怪兽达到一定水平所需要的食物。当我运行程序时,它说:“无法从double转换为int”。有人可以解释为什么吗?这是程序。 问题答案: 您必须这样做: 如您在文档中所看到的,它会按设计返回a ,但是如果需要,则必须执行显式强制转换。

  • 问题内容: 我的代码中有这个 Eclipse告诉我使用静态 相反,为什么呢?有什么区别,这两种方法之间的功能是否完全不同? 问题答案: 只有一种方法,而不是两种,它是静态的。虽然您可以通过实例引用调用静态方法,但这不是很好的样式。它表明程序员认为他或她正在调用实例方法。一个困惑的程序员可能会认为他或她可以使另一个线程(不是当前线程)以这种方式进入睡眠状态,而这并不是这样做的。 您的两行代码都做同样

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,