繁体   English   中英

用Java最快的方法来接收double的绝对值是什么?

[英]What the fastest way in java to receive absolute value of double?

我使用如下代码:

Double getabsValue(final Object[] value){

if (value==null) return null;
if (value.lengt==0) return null;

final Double absValue=Maths.abs(value[0]);

if (absValue>0) return absValue
else return null;

但是在我的应用程序中,我的性能存在问题。 如何进行优化?

也许更好地利用?

if (absValue>0) return absValue
else return absValue<0?-absValue:null;

谢谢

好吧,您目前所拥有的代码甚至无法编译-据我所知,没有Math.abs(Object)调用。 但是,假设您实际在该处进行Double ,那么您将一直处于拳击状态。 你可能避免装箱当值已经大于0,且避免通话时的值 0,这样的:

static Double getAbsValue(Object[] values) {
    if (values == null || values.length == 0) {
        return null;
    }
    Double value = (Double) values[0];
    return value > 0 ? value
         : value == 0 ? null
         : -value;
}

到最后一个选项时,我们已经知道该值是负数,因此我们真的不再需要调用abs了。

目前还不清楚上下文是什么。 您说您遇到了性能问题,但是在代码中肯定是这样吗?

编辑:您的最新代码显示:

if (absValue>0) return absValue
else return -1*absValue;

那不会做同样的事情-如果数组包含装箱的0值,则不会返回null,就像原始代码一样。

在表现之前,您应该专注于正确性。

您希望代码在输入为0的情况下做什么? 如果您希望它返回0,那么我将使用:

return value >= 0 ? value : -value;

如果希望它返回null,请使用我最初提供的代码。

顺便说一下,为什么要包括乘以-1而不是仅使用一元求反运算符? 无论如何,我都希望编译器或JIT都可以摆脱它,但是从根本上讲,您不想执行乘法-您想要执行求反。 使您的代码尽可能地接近于您描述目标的方式。

我使用如下代码:

Double getabsValue(final Object[] value){

为什么?

我要做的第一件事是重新定义签名。

  • 是没有意义的指定Object[]当它基本上具有是一个Double[]或至少一个Object[] 含有双打,否则会抛出ClassCastException。
  • 仅使用第一个元素时为什么要指定数组?
  • 为什么一个Double当你真正需要的是一个double

因此,我将其重新定义为采用double类型的单个参数。 这将使事情从数组中移出的开销移回到调用者可以看到的位置。 他甚至可能没有一个数组,这样他就能建造它来调用此方法。 并且他可能已经有一个Double而不是Double,在这种情况下,他或编译器将不得不将其装箱成Double。

我要做的第二件事是查看此更改后剩下的内容。 更改摆脱了null和length检查以及类型转换,因此剩下的就是return Math.abs(d); 因此很明显,整个方法基本上是没有意义的。

所以我要做的第三件事就是删除它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM