簡體   English   中英

Math.max(a,b)或(a> b)?a:b在Java中更快?

[英]Is Math.max(a,b) or (a>b)?a:b faster in Java?

Java中哪一個更快?為什么?

  1. Math.max(a,b)
  2. (a>b)?a:b

(這是在接受采訪時被問到的。)

Math.max(a, b)是一個靜態函數(意味着沒有虛擬調用開銷),並且可能會被JVM內聯到與(a > b) ? a : b相同的指令(a > b) ? a : b (a > b) ? a : b

是Java中Math.max()代碼:

public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

因此,代碼可能(幾乎)完全相同的速度。

(說實話,如果你擔心速度提升到如此低的水平,你的代碼可能會遇到更大的問題。)

在開始推測之前,性能問題總是需要測試:

public static void maxtest()
{
    int res = 0;
    for( int idx = 0; --idx != 0; )
        // res = ( res > idx ) ? res : idx;
        res = Math.max( res, idx );
    System.out.println( "res: " + res );
}

在最新的1.6.1 x64服​​務器Sun JVM上,使用Math.max()運行6秒,使用?:運行3.2秒。 那么?:實際上更快。 與我們希望放在JIT中的所有希望相反,當他們仍然沒有抓住一切時真正變得驚人。

編輯:出於好奇,我也在同一台機器上使用32位客戶端JVM 1.6.1嘗試了這個代碼,並且這兩個版本在7秒內運行! 所以它可能不是沒有內聯的方法調用,但是服務器JIT似乎能夠為這個特定的測試用例做一些額外的優化,它在涉及方法調用時無法檢測到。

不要依賴猜測 相反, 基准您的特定用例。

許多其他答案中的一些容易被忽視的細節:

雖然您可以看到Math.max的Java源代碼,但實際上並不總是使用它。 幾乎每個JRE都有​​這種方法的內在版本。 有關此類內在函數的列表,請參閱JDK7中的Hotspot源代碼, vmSymbols.hpp

據我所知,Hotspot會在看到maxmin語句時嘗試一些優化; 特別是優化例如arraycopy 除此之外,它實際上將優化Math.max(same, same)

然而,在其他情況下,它可能沒有太多優化; (a<=b)?a:b實際上可能更快。 我已經進行了一些基准測試,事實上我經常發現它更快。 但YMMV,如果Hotspot可以更好地優化其中一個,它肯定取決於上下文。 它也會有所不同,從熱點版本到熱點版本......

如果我在面試中提出這樣的問題,我本來希望候選人告訴我這兩個表達可能不會對所有可能類型的a和b給出相同的結果。

原始問題沒有指定參數的類型。 這很重要,因為浮點參數的max(和min)定義更復雜。 對於浮點(double或float),Math.max方法可能較慢,但如果其中一個參數為NaN,它也可能返回不同的結果。

不一樣。 在你寫作時(a > b) ? a : b (a > b) ? a : b你沒有額外的函數調用,所以它會更快。 它相當於C ++中的內聯。 但這不會對現實生活產生任何影響。 Math.max(a,b)更具可讀性,所以我會用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM