java中哪個更快?java中循環上的混淆問題
a) for(int i = 100000; i > 0; i--) {}
b) for(int i = 1; i < 100001; i++) {}
我一直在尋找答案的解釋是選項a,任何人?任何幫助表示讚賞
java中哪個更快?java中循環上的混淆問題
a) for(int i = 100000; i > 0; i--) {}
b) for(int i = 1; i < 100001; i++) {}
我一直在尋找答案的解釋是選項a,任何人?任何幫助表示讚賞
有些情況下,Java中的反向循環可能稍快。這裏有一個benchmark顯示一個例子。通常,差異通過增量/減量指令或循環終止比較指令中的實現細節來解釋,無論是在底層處理器體系結構的上下文中。在更復雜的示例中,反轉循環可以幫助消除依賴關係,從而啓用其他優化,或者可以提高內存局部性和緩存,甚至垃圾回收行爲。
對於所有情況,我們不能假定任何一種循環都會更快 - 對於具體情況,需要一個基準來確定哪個平臺在給定平臺上性能更好。而且我甚至沒有考慮JIT編譯器與此有什麼關係。
無論如何,這是微型優化,可以使代碼更難以閱讀,而不會提供明顯的性能提升。因此,除非嚴格需要,否則最好避免它們,記住 - 「過早優化是萬惡之源」。
剛剛說出我的帽子,但我知道彙編語言具有特定的比較爲零,比註冊值之間比較需要更少的週期。
通常減量指令可以設置標誌,所以你不需要比較指令。你也需要比較的價值,儘管這可能被放置在一個短循環的寄存器中(而且在長循環中並不重要)。 –
你告訴答案是這樣的,我想是一個答案:java虛擬機將以「更快」的方式「比較」零比較。
通常,Oracle HotSpot強調實際代碼中的優化,這意味着前向循環優化比後向循環更有可能實現。從機器代碼的角度來看,遞減循環可能會保存一條指令,但它不太可能對性能產生重大影響,特別是當有很多內存訪問正在進行時。我知道現代CPU或多或少地像向前一樣快樂地向後倒退(歷史上曾經有一段時間,他們對前向訪問進行了更好的優化)。他們甚至會優化某些跨步訪問模式。
(另熱點(至少在服務器/ C2味)能夠去除空循環。)
接聽「這是更快」應該很容易,不是嗎? (雖然沒有副作用,但是誰知道,JVM可能會優化它的存在。) –
你是說「A」明確比「B」快嗎? –
有一些邏輯,可能是 – sum2000