Какой самый быстрый способ в java получить абсолютное значение double? - PullRequest
0 голосов
/ 13 октября 2011

Я использую код как:

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 ]

7 голосов
/ 13 октября 2011

Ну, код, который вы получили в данный момент, даже не скомпилируется - насколько мне известно, вызова 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, как это делает ваш исходный код.

Перед выполнением следует сосредоточиться на правильности.

Что вы хотите, чтобы ваш код делал с вводом 0?Если вы хотите, чтобы он возвращал 0, я бы использовал:

return value >= 0 ? value : -value;

Если вы хотите, чтобы он возвращал ноль, используйте код, который я предоставил изначально.

Зачем включать умножение на -1а не просто использовать унарный оператор отрицания, кстати?Я ожидаю, что компилятор или JIT все равно избавятся от этого, но принципиально вы не хотите, чтобы выполняли умножение - вы хотите выполнить отрицание.Сделайте так, чтобы ваш код читался как можно ближе к тому, как вы бы описали свои цели.

3 голосов
/ 13 октября 2011

Я использую код вроде:

Double getabsValue(final Object[] value){

Почему?

Первое, что я хотел бы сделать с этим, это переопределить подпись.

  • Бессмысленно указывать Object[], когда оно в основном должно быть Double[] или, по крайней мере, Object[], которое содержит Удваивается, в противном случае будет выброшено исключение ClassCastException.
  • Зачем указывать массив, когда вы используете только первый элемент?
  • Почему Double, когда вам действительно нужно это double?

Так что я бы переопределил егоэто взять единственный аргумент типа double.Это переносит накладные расходы на получение данных из массива обратно к вызывающей стороне, где он может это видеть.Он может даже не иметь массива , поэтому ему придется создать его для вызова этого метода.И у него уже может быть двойное число, а не двойное, и в этом случае он или компилятор снова должны поместить его в двойное число.

Второе, что я хотел бы сделать с ним, это просмотреть то, что осталось после этого изменения.Это изменение избавляет от проверок нулевой длины и длины, а также от типа, и все, что вам остается, это return Math.abs(d);. Таким образом, становится ясно, что весь метод в основном бессмыслен.

Итак, третье, что я бы сделалс ним это удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...