java中接收double绝对值的最快方法是什么?
我使用的代码如下:java中接收double绝对值的最快方法是什么?,java,absolute,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; 但在我的应用程序中,我的性能有问题。 如何对其进行优化 也许更好用 i
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;
if(absValue>0)返回absValue
否则返回absValue好吧,你现在得到的代码甚至不会编译-据我所知没有Math.abs(Object)
调用。然而,假设你真的有一个双倍的演员阵容,你将一直在拳击。可以在值已经大于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){
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;
为什么?
我要做的第一件事就是重新定义签名
- 当对象基本上必须是
Double[]
或至少是包含Double的对象[]
时,指定对象[]
是没有意义的,否则它将抛出ClassCastException
- 为什么只使用第一个元素时指定数组
- 当你真正需要的是双倍密码时,为什么要双倍密码
因此,我会重新定义它,使其接受类型为double
的单个参数。这将把从数组中取出内容的开销移回到调用者可以看到的地方。他甚至可能没有数组,所以他必须构造它来调用这个方法。他可能已经有了一个double而不是double,在这种情况下,他或编译器将不得不把它装箱成double
我用它做的第二件事是回顾这次改变后剩下的东西。该更改消除了空值和长度检查以及类型转换,因此只剩下返回Math.abs(d)代码>因此,很明显,整个方法基本上是毫无意义的
因此,我要做的第三件事是删除它。您如何确定Math.abs()
是性能瓶颈?此代码是否编译?它不应作为java.math.math#abs(…)
不允许将对象
作为参数。它不会比您的最新编辑更快,即如果(absValue>0)返回absValue,否则返回-1*absValue代码>@Shahzeb:事实上,它可能。。。使用=0
可以避免在0的情况下调用Double.valueOf
,也可能是一种更快的比较(我怀疑它只需要检查一个位)。我不知道是否有Double.valueOf(0)
的缓存值,但如果没有,如果值经常为0,则装箱可能会产生重大影响。@JonSkeet感谢您提出这一点,是像您这样的人造就了今天的局面。抱歉,我忘记了将其转换为(Double)@user710818:如果您要强制转换为Double
,那么这种方法中进行的自动装箱和自动取消装箱(可能在整个代码中)对性能的影响比调用Math.abs()
要大得多。描述一下,自己看看。@Joachim Sauer这当然是真的,但对于OP来说有办法解决它。@Shahzeb:如果他坚持只更改发布的代码,那么他不会走得太远。他可能需要做一些更大的修改。但是:他必须在改变任何事情之前对其进行分析。+1:正确性比表现更重要。无论你能以多快的速度做一些99.9%都不正确的事情。我想指出的是,使用double
比使用double
或Object
更快,但我怀疑这并不重要,