Производительность "Math.abs ()" лучше, чем выражение "если"? - PullRequest
2 голосов
/ 13 октября 2011

У меня есть выражение:

Double getAbs(Double value){
return value> 0 ? value: value== 0 ? null : -value;
}

или лучше:

 Double getAbs(Double value){
return Math.abs(value);
}

Я понимаю, что есть некоторые различия в NaN.Но метод Math.abs (double) - так у нас есть распаковка.В каком случае производительность лучше?

Ответы [ 3 ]

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

Единственная «производительность» в вашем коде заключается в том, что JVM необходимо распаковать ваш Double в double.

Math.abs(double) использует троичное выражение if следующим образом:

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}

Итак, ваше заявление if вообще не является проблемой для производительности.

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

Нет, обычно Math.abs() не медленнее, чем у вас.Потому что JVM может реализовать свою математическую операцию в соответствии с целевой машиной.и Это может быть быстрее, чем ваша реализация.

Генераторам кода рекомендуется использовать платформенно-зависимые библиотеки или инструкции микропроцессора, где это возможно, для обеспечения высокопроизводительных реализаций методов Math.Такие реализации с более высокой производительностью все еще должны соответствовать спецификации Math.

Для получения дополнительной информации прочитайте this .

В любом случае, если вам требуется более высокая производительность -в этом случае вы можете использовать double вместо Double и забыть свой getAbs() и использовать Math.abs() напрямую.

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

Я только что посмотрел на Sun реализацию Oracle, и вот как они ее реализовали

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}

За исключением стоимости распаковки и автобоксирования параметров и возвращаемых значенийне должно быть никакого другого влияния на производительность.

...