“Math.abs()”的性能是否是?比用“if”表达更好?

发布于 2024-12-09 17:53:47 字数 287 浏览 3 评论 0原文

我有表达:

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

或者更好:

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

我理解 NaN 存在一些差异。但是方法 Math.abs(double) - 所以我们拆箱了。 什么情况下性能更好?

I have expression:

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

or better:

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

I understand that there are some differences about NaN. But method Math.abs(double) - so we have unboxing.
In which case performance better?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

念﹏祤嫣 2024-12-16 17:53:47

代码中唯一的“性能”是 JVM 需要将您的 Double 拆箱为 double

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

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

因此,您的 if 语句根本不用担心性能问题。

The only "performance" in your code is that the JVM will need to unbox your Double to double.

Math.abs(double) uses a ternary if statement as follows:

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

So, your if statement is no performance worry at all.

落叶缤纷 2024-12-16 17:53:47

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

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

有关更多信息,请阅读

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

No usually, Math.abs() is not slower than yours. Because JVM can implement its math operation according to the target machine. and It can be faster than your implementation.

Code generators are encouraged
to use platform-specific native libraries or microprocessor
instructions, where available, to provide higher-performance
implementations of Math methods. Such higher-performance
implementations still must conform to the specification for Math.

For more information read this.

Anyway, if you need better performance -in this case- you can use double instead of Double and forget your getAbs() and use Math.abs() directly.

戏剧牡丹亭 2024-12-16 17:53:47

我刚刚查看了 SunOracle 的实现,这就是他们的实现方式。

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

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

I just had a look at SunOracle's implementation and this is how they've implemented it

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

Except for the cost of unboxing and autoboxing params and return values, there shouldn't be any other performance impact.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文