[英]Is Math.max(a,b) or (a>b)?a:b faster in Java?
Java中哪一個更快?為什么?
Math.max(a,b)
(a>b)?a:b
(這是在接受采訪時被問到的。)
Math.max(a, b)
是一個靜態函數(意味着沒有虛擬調用開銷),並且可能會被JVM內聯到與(a > b) ? a : b
相同的指令(a > b) ? a : b
(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會在看到max
或min
語句時嘗試一些優化; 特別是優化例如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.