4

重複の可能性:
時間とキャッシュのパフォーマンスの観点から、これら2つのforループのどちらがより効率的
ですか?2D配列を反復処理するときに、ループの順序がパフォーマンスに影響するのはなぜですか?

配列を通過する最速の方法を知りたいのですが、大きな配列ではその重要な方法を使用しています。たとえば、私は持っています:

ushort[, , ,] map = new ushort[3000, 3000, 3, 3]; // [pointX, pointY, stack, lvl]

          for (int i = 0; i < 3000; i++)
              for (int j = 0; j < 3000; j++)
                  for (int k = 0; k < 3; k++)
                      for (int l = 0; l < 3; l++)
                         map[i, j, k, l] = 45001;

これらの値がメモリにどのように格納されるかに依存するため、おそらく関連性があります。したがって、その場合は、これをこの順序で実行する方がよいでしょう-i-> j->k->lまたはl->k->j-> i?

また、他の言語でも違いますか?

4

1 に答える 1

2

これは、Javaで配列を初期化する方法に大きな違いをもたらします。以下は、違いを示す純粋なJavaコードです。以下のコードを参照して、効率を向上させることができます。

public class MutipleArray {

    public static void main(String[] args) {
        long t0 = System.currentTimeMillis();
        int [][][][] map = new int[3000][3000][3][3];
        for (int i = 0; i < 3000; i++)
            for (int j = 0; j < 3000; j++)
                for (int k = 0; k < 3; k++)
                    for (int l = 0; l < 3; l++)
                       map[i][j][k][l] = 45001;
        long t1 = System.currentTimeMillis();
        System.out.println("Time for initializing the first Array:"+(t1-t0)+"ms");

        int [][][][] map2 = new int[3][3][3000][3000];
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                for (int k = 0; k < 3000; k++)
                    for (int l = 0; l < 3000; l++)
                        map2[i][j][k][l] = 45001;
        long t2 = System.currentTimeMillis();
        System.out.println("Time for initializing the second Array:"+(t2-t1)+"ms");
    }
}

結果:

Time for initializing the first Array:13570ms
Time for initializing the second Array:495ms

そのため、Javaでは代わりにint [] [] [] [] map = new int [3] [3][3000][3000]を使用することをお勧めします。

于 2012-12-10T07:35:28.707 に答える