java中接收绝对值double的最快方法是什么?

时间:2011-10-13 06:02:07

标签: java absolute

我使用的代码如下:

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;

由于

2 个答案:

答案 0 :(得分: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无论如何都要摆脱它,但从根本上说你不希望执行乘法 - 你想要执行否定。让您的代码尽可能地与您描述目标的方式一致阅读。

答案 1 :(得分:3)

  

我使用的代码如下:

Double getabsValue(final Object[] value){

为什么?

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

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

所以我会重新定义它以采用return Math.abs(d);类型的单个参数。这将把数据从数组中取出的开销转移回调用者,在那里他可以看到它。他甚至可能没有拥有数组,所以他必须构造它来调用这个方法。并且他可能已经有一个double而不是Double,在这种情况下,他或者编译器必须将它装入Double。

我要做的第二件事是回顾这次改变后剩下的东西。这个变化摆脱了空值和长度检查以及类型转换,所以剩下的就是{{1}}所以很明显整个方法基本没有意义。

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