Java 是不是表现得很好;Math.abs();比用“表示”更好;如果“是”的话;?

Java 是不是表现得很好;Math.abs();比用“表示”更好;如果“是”的话;?,java,performance,double,boxing,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(double)——所以我们有拆箱。 在哪种情况下性能更好?通常情况下,Math.abs()不会比您的慢。因为JVM可以根据目标机器

我有一个表达:

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

 Double getAbs(Double value){
return Math.abs(value);
}
我知道NaN有一些不同之处。但是方法Math.abs(double)——所以我们有拆箱。 在哪种情况下性能更好?

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

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

欲了解更多信息,请阅读

无论如何,如果您需要更好的性能-在这种情况下-您可以使用
double
而不是
double
,忘记您的
getAbs()
,直接使用
Math.abs()

我刚刚看过SunOracle的实现,他们就是这样实现的

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}
公共静态双abs(双a){
return(a代码中唯一的“性能”是JVM需要将
Double
解装箱到
Double

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

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}
公共静态双abs(双a){

返回(a您需要在两个示例中取消装箱,所以这不是区别。并且:正如我在您之前的帖子中告诉您的:不要猜测您的性能瓶颈。分析您的应用程序,然后再尝试修复热点。为什么您需要用自己的方法包装Math.abs?仅调用开销就会导致性能损失。+1:在这两种情况下JVM足够聪明,可以将两者转换为一条机器代码指令。使用您自己的稍微不同的
?:
表达式可能会混淆JIT编译器,因此它的速度只能较慢。