“Math.abs()”的表现比“if”表达更好吗?

时间:2011-10-13 07:58:10

标签: java performance double boxing

我有表达:

Double getAbs(Double value){
return value> 0 ? value: value== 0 ? null : -value;
}

或更好:

 Double getAbs(Double value){
return Math.abs(value);
}

据我所知,NaN存在一些差异。但方法Math.abs(双) - 所以我们有拆箱。 在哪种情况下表现更好?

3 个答案:

答案 0 :(得分:7)

代码中唯一的“性能”是JVM需要将Double重新打包到double

Math.abs(double)使用三元if语句如下:

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}

因此,您的if声明根本不存在性能问题。

答案 1 :(得分:4)

通常情况下,Math.abs()并不比你的慢。因为JVM可以根据目标机器实现其数学运算。它可能比你的实现更快。

  

鼓励代码生成器   使用特定于平台的本机库或微处理器   可用的说明,以提供更高的性能   数学方法的实现。这样的更高性能   实现仍然必须符合Math的规范。

有关详细信息,请参阅this

无论如何,如果您需要更好的效果 - 在这种情况下,您可以使用double代替Double而忘记您的getAbs()并使用{{1直接。

答案 2 :(得分:3)

我刚看了一下 Sun Oracle的实现,这就是他们实现它的方式

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}

除了取消装箱和自动装箱参数和返回值的成本之外,不应有任何其他性能影响。