2011-10-13 44 views
2

我有表達:「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(雙) - 所以我們有拆箱。 在哪種情況下性能更好?

+1

您需要在**兩個**樣本中取消裝箱,所以* *不是區別。 –

+2

並且:正如我在之前的文章中告訴過你的:**不要猜測你的性能瓶頸。 **簡要描述你的應用程序**和*然後*嘗試修復熱點。 –

+2

爲什麼你需要用你自己的方法來包裝Math.abs?僅通話開銷就會導致性能損失。 – StuartLC

回答

7

您的代碼中唯一的「性能」是JVM需要將您的Double解包爲double

Math.abs(double)使用三元if語句如下:

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

所以,你if說法是沒有表現擔心。

+1

+1:在這兩種情況下,JVM都足夠智能,可以將其轉換爲單個機器代碼指令。使用自己的,略有不同的'::'表達式可能會混淆JIT編譯器,所以它只會變慢。 –

4

通常沒有,Math.abs()不會比你的慢。因爲JVM可以根據目標機器實現其數學運算。它可以比你的實現更快。

代碼生成鼓勵 使用特定平臺的本地庫或微處理器 指令,其中可用,提供更高的性能 的數學方法的實現。這種更高性能的實現仍然必須符合數學規範。

欲瞭解更多信息,請閱讀this

無論如何,如果你需要更好的性能-in這個病例可以使用double代替Double,忘記你的getAbs()並直接使用Math.abs()

3

我只是看看 太陽 Oracle的實現,這是如何,他們已經實現了它

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

除的拆箱成本和自動裝箱參數和返回值,不應該有任何其他性能影響。

相關問題