【问题标题】:Two-dimensional array iteration approach is faster than another approach二维数组迭代方法比另一种方法更快
【发布时间】:2015-05-11 05:47:51
【问题描述】:

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

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);

【问题讨论】:

  • 你有什么疑问?你想知道什么?
  • @joshstrike 的答案是对的!
  • 我试过你的代码,都给出了相同的输出:20100。所以nothing is wrong

标签: java


【解决方案1】:

这是loop interchange

虽然我无法完全观察到与您的机器相同的结果(我的机器相当在 Intel i7-4770K 上非常强大,而且代码非常简单非常我用于堆栈溢出问题的类),通常这种循环具有更高性能的倾向。

它更高效的主要原因是它迭代的元素的局部性。迭代连续内存比迭代非连续内存效率更高。

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

int[] anArray = new int[5];

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

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

*:或者至少尝试一下。

对于二维数组,Java 将执行相同的操作,但要注意的是,它不会像内存中的网格(如 C 那样),而是指向数组的数组。

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

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

【讨论】:

  • 是的,这就解释了为什么第二种循环方式应该比第一种更快。但 OP 声称相反。
【解决方案2】:

因为您在将 [i][j] 推入该数组时忘记在值中进行切换。

【讨论】:

  • 切换 i 和 j 会产生 ArrayIndexOutOfBoundsException。
  • values[i][j] 在第二个版本中可能是正确的,在第一个版本中是错误的,但无论如何它可能需要首先测试或定义,重点是,这就是为什么他的两个代码片段产生两个不同的和。
  • 它们都产生相同的总和 - 20100。
  • 啊,这有什么意义。好吧,就像这个问题的标题是“数组计算差异的总和”,在这家伙反复编辑它的过程中,我很确定他消除了原始问题和部分违规代码。这个网站让我很失望。
  • 如果问题不清楚,在没有弄清楚之前回答是没有意义的。
猜你喜欢
  • 2013-06-27
  • 2011-08-01
  • 2023-02-06
  • 2018-10-13
  • 1970-01-01
  • 2021-04-24
  • 2017-01-26
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多