我知道结果是一样的,但第一个循环比第二个循环快。那是为什么?
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);
答案 0 :(得分:3)
虽然我无法准确地观察到与您的计算机相同的结果(我的非常使用英特尔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]。