我一直在做Android循環的一些實驗,並對結果感到困惑。Android循環字節碼比較
在過去,我讀的地方,(在C++?)如果你翻譯這個循環:
for(int i = 0; i != Integer.MAX_VALUE; i++)
{
// Do something
}
......這個循環:
for(int i = threshold; --i >= 0;)
{
// Do the same
}
你可以得到一個顯著上升的性能,因爲第二個變體會生成與零的比較,這歸因於處理器體系結構比第一個循環中兩個非零值之間的比較快得多。
我想看看這是否在Android中保持真實,所以我開始寫代碼並使用DEX偷看生成的Dalvik的字節碼,以檢查是否沒有任何類型的編譯器優化。
事實上,這些都是結果:
0003dc: 1201 |000e: const/4 v1, #int 0 // #0
0003de: 1402 ffff ff7f |000f: const v2, #float NaN // #7fffffff
0003e4: 3321 5000 |0012: if-ne v1, v2, 0062 // +0050
000434: 1401 ffff ff7f |003a: const v1, #float NaN // #7fffffff
00043a: d801 01ff |003d: add-int/lit8 v1, v1, #int -1 // #ff
00043e: 3b01 2800 |003f: if-gez v1, 0067 // +0028
(這是不相關的代碼,在0062和0067的問題,因爲我只是通過循環它的自我關注)。
好吧,但我們可以清楚地看到編譯器/轉換器沒有引入優化,因爲兩個循環語法都有不同的生成字節碼。
現在的上下文設置,並且我證明,它會繼續它的時候,這個問題測試有用:
「說完我異形上面的代碼,並發現了不管的順序第一個循環的執行總是需要比第二個更多的時間,我在這裏錯過了什麼?「
就像JIT編譯爲我做一些優化?
我期望這兩個循環的行爲不同,因爲生成的字節碼是不一樣的。
非常感謝在這個問題上給我的啓發。
感謝,威樂!正如我在Yury的評論中所說的那樣,時間與循環的執行順序無關。現在,無論你把它第一次將始終運行慢... – 2012-03-20 16:03:35