2011-12-18 55 views
0

java中哪個更快?java中循環上的混淆問題

a) for(int i = 100000; i > 0; i--) {} 
b) for(int i = 1; i < 100001; i++) {} 

我一直在尋找答案的解釋是選項a,任何人?任何幫助表示讚賞

+0

接聽「這是更快」應該很容易,不是嗎? (雖然沒有副作用,但是誰知道,JVM可能會優化它的存在。) –

+0

你是說「A」明確比「B」快嗎? –

+0

有一些邏輯,可能是 – sum2000

回答

7

有些情況下,Java中的反向循環可能稍快。這裏有一個benchmark顯示一個例子。通常,差異通過增量/減量指令或循環終止比較指令中的實現細節來解釋,無論是在底層處理器體系結構的上下文中。在更復雜的示例中,反轉循環可以幫助消除依賴關係,從而啓用其他優化,或者可以提高內存局部性和緩存,甚至垃圾回收行爲。

對於所有情況,我們不能假定任何一種循環都會更快 - 對於具體情況,需要一個基準來確定哪個平臺在給定平臺上性能更好。而且我甚至沒有考慮JIT編譯器與此有什麼關係。

無論如何,這是微型優化,可以使代碼更難以閱讀,而不會提供明顯的性能提升。因此,除非嚴格需要,否則最好避免它們,記住 - 「過早優化是萬惡之源」。

+2

我猜測,基準測試只會變得更快,因爲數組的最後一位仍然在緩存中。 /特別是1000萬和1500萬次運行在正向和反向運行之間都有完全相同的(31毫秒)時間差。 –

+1

「過早優化是萬惡之源」值得再次引用**! – dantuch

+0

@ TomHawtin-tackline什麼數組? – harold

2

剛剛說出我的帽子,但我知道彙編語言具有特定的比較爲零,比註冊值之間比較需要更少的週期。

+0

通常減量指令可以設置標誌,所以你不需要比較指令。你也需要比較的價值,儘管這可能被放置在一個短循環的寄存器中(而且在長循環中並不重要)。 –

0

你告訴答案是這樣的,我想是一個答案:java虛擬機將以「更快」的方式「比較」零比較。

1

通常,Oracle HotSpot強調實際代碼中的優化,這意味着前向循環優化比後向循環更有可能實現。從機器代碼的角度來看,遞減循環可能會保存一條指令,但它不太可能對性能產生重大影響,特別是當有很多內存訪問正在進行時。我知道現代CPU或多或少地像向前一樣快樂地向後倒退(歷史上曾經有一段時間,他們對前向訪問進行了更好的優化)。他們甚至會優化某些跨步訪問模式。

(另熱點(至少在服務器/ C2味)能夠去除空循環。)