如果你看看字節碼的兩個功能,你會發現他們幾乎如出一轍:
$ cat test.java
class test {
public static void forfor() {
int width = 15, height = 15;
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++) {
// do stuff here
}
}
public static void dofor() {
int width = 15, height = 15, y = 0;
do for (int x = 0; x++ < width;) {
// do stuff here
} while (y++ < height);
}
}
$ javac test.java
$ javap -c test
public static void forfor();
Code:
0: bipush 15
2: istore_0
3: bipush 15
5: istore_1
6: iconst_0
7: istore_2
8: iload_2
9: iload_1
10: if_icmpge 32
13: iconst_0
14: istore_3
15: iload_3
16: iload_0
17: if_icmpge 26
20: iinc 3, 1
23: goto 15
26: iinc 2, 1
29: goto 8
32: return
public static void dofor();
Code:
0: bipush 15
2: istore_0
3: bipush 15
5: istore_1
6: iconst_0
7: istore_2
8: iconst_0
9: istore_3
10: iload_3
11: iinc 3, 1
14: iload_0
15: if_icmpge 21
18: goto 10
21: iload_2
22: iinc 2, 1
25: iload_1
26: if_icmplt 8
29: return
唯一真正的區別是,在forfor
,兩個條件都在檢查開始循環,而在dofor
中,一個在開始時被檢查,一個在結束時被檢查。考慮到在最裏面的循環體中有完全相同的指令,我無法想象該字節碼重新排序的任何性能影響。
儘管如此,我相信forfor
方法是兩個更好,因爲:
- 其用意是顯而易見的
- 它不太容易出錯(另見在這個問題上找到了一個註釋在
dofor
!)
- 如果
height
爲零,dofor
將錯誤地仍然執行循環的一個通過,而forfor
通過完全跳過外循環做正確的事情。
這兩種方式都沒有什麼區別。這不值得擔心。 –
它在性能方面很有效率;但在可讀性方面效率不高。 –
請注意,這兩個循環不是等價的:在最內層循環中,第二種情況下'x'比第一種情況大1。 –