這個問題與此相同 Two loop bodies or one (result identical) 但在我的情況下,我使用Java。一個循環中的兩個操作與兩個循環每個循環執行相同的操作
我有兩個循環運行10億次。
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a^i;
if (t > aMax)
aMax = t;
}
for (int i = 0; i < 1000000000; i++) {
int t = b^i;
if (t > bMax)
bMax = t;
}
在我的機器上運行這兩個循環所用的時間約爲4秒。當我將這兩個環路融合成一個單一的環路並執行單個環路中的所有操作時,它將在2秒內運行。正如你所看到的,微不足道的操作構成了循環內容,因此需要時間不變。
我的問題是我在哪裏獲得這種性能改進?
我猜測,在兩個獨立的循環中性能受到影響的唯一可能的地方是,它會增加i並檢查我是否將10億次循環融合在一起,而如果我只將10億次乘以10億次。那裏有其他事情嗎?
謝謝!
我會假設這是因爲你正在做1B更多的增量,1B更多的比較,和1B更跳躍... – verdesmarald
在循環內部移動'int t;'聲明並僅在循環內執行賦值't = a^i;'或't = b^i;'會產生什麼影響? – barrowc
@barrowc它不會有任何效果。 JIT的第一個階段之一是將AST圖轉換爲單一分配表示,爲了更好地進行壽命分析,這將消除這種混疊。 – ddimitrov