我有表達:「Math.abs()」的表現是否比表達「if」更好?
Double getAbs(Double value){
return value> 0 ? value: value== 0 ? null : -value;
}
或更好:
Double getAbs(Double value){
return Math.abs(value);
}
據我所知,大約有南有些差異。但方法Math.abs(雙) - 所以我們有拆箱。 在哪種情況下性能更好?
我有表達:「Math.abs()」的表現是否比表達「if」更好?
Double getAbs(Double value){
return value> 0 ? value: value== 0 ? null : -value;
}
或更好:
Double getAbs(Double value){
return Math.abs(value);
}
據我所知,大約有南有些差異。但方法Math.abs(雙) - 所以我們有拆箱。 在哪種情況下性能更好?
您的代碼中唯一的「性能」是JVM需要將您的Double
解包爲double
。
Math.abs(double)
使用三元if語句如下:
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
所以,你if
說法是沒有表現擔心。
+1:在這兩種情況下,JVM都足夠智能,可以將其轉換爲單個機器代碼指令。使用自己的,略有不同的'::'表達式可能會混淆JIT編譯器,所以它只會變慢。 –
通常沒有,Math.abs()
不會比你的慢。因爲JVM可以根據目標機器實現其數學運算。它可以比你的實現更快。
代碼生成鼓勵 使用特定平臺的本地庫或微處理器 指令,其中可用,提供更高的性能 的數學方法的實現。這種更高性能的實現仍然必須符合數學規範。
欲瞭解更多信息,請閱讀this。
無論如何,如果你需要更好的性能-in這個病例可以使用double
代替Double
,忘記你的getAbs()
並直接使用Math.abs()
。
我只是看看
太陽
Oracle的實現,這是如何,他們已經實現了它
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
除的拆箱成本和自動裝箱參數和返回值,不應該有任何其他性能影響。
您需要在**兩個**樣本中取消裝箱,所以* *不是區別。 –
並且:正如我在之前的文章中告訴過你的:**不要猜測你的性能瓶頸。 **簡要描述你的應用程序**和*然後*嘗試修復熱點。 –
爲什麼你需要用你自己的方法來包裝Math.abs?僅通話開銷就會導致性能損失。 – StuartLC