4

可能重复:
这两个 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 回答