二维数组迭代方法比另一种方法更快

时间:2015-05-11 05:47:52

标签: java

我知道结果是一样的,但第一个循环比第二个循环快。那是为什么?

int[][] values = new int[10][20];

int sum = 0;
int count = 0;
for (int j = 0; j < 20; j++) {

    for (int i = 0; i < 10; i++) {
        count++;
        values[i][j] = count;

        sum += values[i][j];
    }

}
System.out.println(sum);
int[][] values = new int[10][20];

int sum = 0;
int count = 0;
for (int i = 0; i < 10; i++) {

    for (int j = 0; j < 20; j++) {
        count++;
        values[i][j] = count;

        sum += values[i][j];
    }

}
System.out.println(sum);

2 个答案:

答案 0 :(得分:3)

这是loop interchange

虽然我无法准确地观察到与您的计算机相同的结果(我的非常使用英特尔i7-4770K,并且代码位于非常我用于Stack Overflow问题的简单类),通常这种循环具有更高性能的倾向。

它性能更高的主要原因是它迭代的元素的位置。迭代连续内存比非连续内存更有效。

让我们考虑一个典型的数组:

int[] anArray = new int[5];

在内存中,Java将保留*五个能够保存int的连续块。

int[5] -> [][][][][]

*:或者至少尝试。

对于二维数组,Java将执行相同的操作,使用catch而不是像内存中的网格一样(如C所示),您将拥有一个指向数组的数组。

int[2][3] -> [ ] [ ]
              |   |
              v   v
             [ ] [ ]
             [ ] [ ]
             [ ] [ ]

就内存布局而言,第二层数组(即长度为20的数组)在内存方面可能比第一层数组(即长度为10的数组)更接近内存。迭代连续内存比非连续内存更有效率,这就是为什么你注意到速度提升的原因。

答案 1 :(得分:0)

因为当你将它们推入那个数组时忘了在值中切换[i] [j]。