#java #performance #double #boxing
#java #Производительность #двойной #бокс
Вопрос:
У меня есть выражение:
Double getAbs(Double value){
return value> 0 ? value: value== 0 ? null : -value;
}
или лучше:
Double getAbs(Double value){
return Math.abs(value);
}
Я понимаю, что есть некоторые различия в NaN. Но метод Math.abs (double) — так что у нас есть распаковка.
В каком случае производительность лучше?
Комментарии:
1. Вам нужна распаковка в обоих образцах, так что это не разница.
2. И: как я уже говорил вам в вашем предыдущем посте: не догадывайтесь о своем узком месте в производительности. Профилируйте свое приложение и только затем попытайтесь исправить горячие точки.
3. Зачем вам нужно обернуть Math.abs в свой собственный метод? Одни только накладные расходы на вызов приведут к потере производительности.
Ответ №1:
Единственная «производительность» в вашем коде заключается в том, что JVM нужно будет распаковать ваш Double
to double
.
Math.abs(double)
использует троичный оператор if следующим образом:
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
Итак, ваше if
утверждение вообще не вызывает беспокойства о производительности.
Комментарии:
1. 1: В обоих случаях JVM достаточно умен, чтобы превратить любой из них в единую инструкцию машинного кода. Использование вашего собственного, немного отличающегося
?:
выражения может привести к путанице компилятора JIT, поэтому оно может быть только медленнее.
Ответ №2:
Обычно нет, Math.abs()
не медленнее, чем у вас. Потому что JVM может реализовать свою математическую операцию в соответствии с целевой машиной. и это может быть быстрее, чем ваша реализация.
Генераторам кода рекомендуется использовать собственные библиотеки для конкретной платформы или инструкции микропроцессора, где это возможно, для обеспечения более высокопроизводительных реализаций математических методов. Такие высокопроизводительные реализации по-прежнему должны соответствовать спецификации для математики.
Для получения дополнительной информации прочитайте это.
В любом случае, если вам нужна лучшая производительность — в данном случае — вы можете использовать double
вместо Double
и забыть свой getAbs()
и использовать Math.abs()
напрямую.
Ответ №3:
Я только что взглянул на СолнцеРеализация Oracle и вот как они ее реализовали
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
За исключением стоимости распаковки и автоматической упаковки параметров и возвращаемых значений, не должно быть никакого другого влияния на производительность.