2013-05-10 85 views
21

我正在通過遞增/遞減運算符我遇到過,如果我運行遞減形式的循環,在這種情況下,它將以增量形式運行得比同樣的循環更快。我期待這兩個步驟都會持續相同的時間,因爲同樣的步驟將會被遵循。我通過網絡搜索,但無法找到令人信服的答案。是否由於遞減運算符比增量運算符需要更少的時間?爲什麼遞減循環比遞增循環運行得更快?

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

你的資源是什麼? – alfasin 2013-05-10 06:04:20

+2

很久以前,i> 0的測試比非null值的測試略快,但我嚴重懷疑這種優化仍然相關。 – 2013-05-10 06:04:52

+2

看到存在的問題和答案: http://stackoverflow.com/questions/8968785/which-loop-has-better-performance-increment-or-decrement/8968842#8968842 – 2013-05-10 06:07:26

回答

43

這是因爲在字節碼中與0進行比較與用非零數進行比較是不同的操作。其實i < 10001要求首先加載堆棧上的數字然後執行比較,而i > 0作爲一個操作執行。當然,由於JVM優化,在大多數情況下不會有速度差異。但是我們可以嘗試使用-Xint選項運行代碼(僅解釋模式執行)。

+5

要驗證,將循環更改爲'for(int i = -100000; i <0; i ++){}'。這消除了這種影響,並減少差異增加與減少(這應該沒有區別)。 – Thilo 2013-05-10 06:06:58

+2

爲什麼0更快? – stinepike 2013-05-10 06:13:53

+7

@StinePike:CPU必須加載2個操作數來比較2個數字。有特殊指令與0比較,所以只有一個操作數必須加載到一個寄存器中。 – jlordo 2013-05-10 06:16:29

4

的Piyush巴德瓦傑

我在網上編譯器檢測了兩個圈,但我的增量循環執行速度更快,然後遞減循環。

程序執行取決於許多因素。有時我們在同一臺機器上運行相同的程序很多次,我們得到不同的執行時間。所以這取決於很多因素。

查看結果

for(int i = 1; i < 100001; i++) { 

} 

增量環 - http://ideone.com/irdY0e

for(int i = 100000; i > 0; i--) { 

} 

遞減循環 - http://ideone.com/yDO9Jf

爵士葉夫根尼·Dorofeev給出了一個專家只能給的優秀解釋。

最後,您需要考慮CPU的性能。在考慮基準來確定Java應用程序的整體性能時,請記住字節碼執行,本機代碼執行和圖形各自發揮作用。它們的影響取決於具體應用的性質。