2017-03-06 3 views
2

普通のネストされたforループではxとyの値を別々に変更できますが、これはwhileループのfor doループでは実行できませんが、メモリの使用効率やパフォーマンスの効率の点で違いがありますか?Javaでwhileループをミキシングするのは効率的ですか?

ループのネストされた普通の

:whileループのための混合DOの

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

これらの2つのループは同等ではないことに注意してください。最も内側のループでは、「x」は最初のケースよりも2番目のケースで1大きいです。 –

答えて

2

あなたは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では、開始時に1つがチェックされ、最後に1つがチェックされます。あなたがまるで最奥のループ本体に同じ命令を持っているとすれば、そのバイトコードの並べ替えのパフォーマンスへの影響は考えられません。その意図は

  • 明らかである

    1. それは以下のバグが発生しやすいが(も見つかっこの質問にコメントを参照してください:私はforfor方法があるため、両者の優れていると信じて、言っ

      doforのバグ!

    2. heightが0の場合、doforはループの1回のパスを誤って実行しますが、forforは外側のループを完全にスキップして正しいことを行います。
  • +0

    ありがとう、私はあなたのコメントをいただきありがとうございます。 –

    関連する問題