0

我使用如下代码:

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;

谢谢

4

2 回答 2

7

好吧,你现在得到的代码甚至都无法编译——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 能够摆脱它,但基本上你不想执行乘法 - 你想要执行否定。使您的代码尽可能接近您描述目标的方式。

于 2011-10-13T06:06:14.140 回答
3

我使用如下代码:

Double getabsValue(final Object[] value){

为什么?

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

  • Object[]指定它何时必须是 aDouble[]或至少是Object[]包含Doubles的至少是没有意义的,否则它将抛出 ClassCastException。
  • 为什么只使用第一个元素时指定数组?
  • 为什么 aDouble当你真正需要的是 a double

所以我会重新定义它以采用 type 的单个参数double。这将把东西从数组中取出的开销转移到调用者可以看到的地方。他甚至可能没有一个数组,所以他必须构造它来调用这个方法。而且他可能已经有一个双精度数而不是双精度数,在这种情况下,他或编译器必须再次将它装箱成双精度数。

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

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

于 2011-10-13T06:55:04.473 回答