我使用的代码如下:
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
的 Actor ,那么您将一直在拳击。当值已经大于 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 无论如何都能摆脱它,但从根本上来说,您不希望执行乘法 - 您希望执行求反。让你的代码读起来尽可能贴近你描述你的目标的方式。
关于java - java中接收double的绝对值最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7750037/