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

use*_*818 0 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;
Run Code Online (Sandbox Code Playgroud)

但在我的应用程序中,我遇到性能问题.如何优化?

也许更好用?

if (absValue>0) return absValue
else return absValue<0?-absValue:null;
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)

当我们到达最终选项时,我们已经知道该值是负数,因此我们实际上不再需要调用abs.

目前还不清楚这里的背景是什么.你说你遇到了性能问题,但这肯定是在这段代码中吗?

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

if (absValue>0) return absValue
else return -1*absValue;
Run Code Online (Sandbox Code Playgroud)

这不会做同样的事情 - 如果数组包含一个盒装的0值,它不会返回null,就像你的原始代码一样.

在演出前你应该专注于正确性.

你希望你的代码用输入0做什么?如果你想让它返回0,那么我会使用:

return value >= 0 ? value : -value;
Run Code Online (Sandbox Code Playgroud)

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

为什么包括乘法-1而不是仅仅使用一元否定算子?无论如何,我希望编译器或JIT能够摆脱它,但从根本上说你不想执行乘法 - 你想要执行否定.让您的代码尽可能地与您描述目标的方式一致.

  • @ user710818:如果你正在使用'Double`,那么在这种方法中进行自动装箱和自动拆箱的可能性(以及*可能*遍及你的代码)对你的表现有更大的影响比任何调用`Math.abs()`.简介并亲眼看看. (2认同)