2017-03-06 66 views
2

除了能夠分別修改普通嵌套for循環中的x和y值,這在while循環的混合do中不能完成,是否會有任何有利的內存使用或性能效率差異?Java中的while循環是否爲混合做效率高?

普通嵌套的for循環:對於while循環混合做的

int width = 15, height = 15; 
     for (int y = 0; y < height; y++) 
      for (int x = 0; x < width; x++) { 
       // do stuff here 
      } 

例子:

int y = 0, width = 15, height = 15; 
     do for (int x = 0; x++ < width;) { 
      // do stuff here 
     } while (y++ < height); 

我發現這個從讀書時,我開始規劃我很老的遊戲引擎代碼時。

+3

這兩種方式都沒有什麼區別。這不值得擔心。 –

+3

它在性能方面很有效率;但在可讀性方面效率不高。 –

+0

請注意,這兩個循環不是等價的:在最內層循環中,第二種情況下'x'比第一種情況大1。 –

回答

2

如果你看看字節碼的兩個功能,你會發現他們幾乎如出一轍:

$ 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方法是兩個更好,因爲:

  1. 其用意是顯而易見的
  2. 它不太容易出錯(另見在這個問題上找到了一個註釋在dofor!)
  3. 如果height爲零,dofor將錯誤地仍然執行循環的一個通過,而forfor通過完全跳過外循環做正確的事情。
+0

謝謝你,我感謝你的評論。 –