迭代2D阵列的循环速度是否比2更快,还是速度相同?

时间:2018-05-14 09:48:04

标签: java arrays

for (int x = 0; x < height; x++) {
        map[x][y] = new Plot(x, y, "map");
        if (x == 199 && y < 199) {
            x = 0;
            y++;
        }
    }

我在这里有这个代码,我设置为地图创建一个200x200对象的2D数组,我想知道它是否是相同的速度或它确实运行得更快。我正在尝试优化阵列创建。

谢谢!

编辑:假设Y从0开始,高度始终为200 编辑2:谢谢所有回答的人:D我可以创造一些东西来测试它,但是呃

2 个答案:

答案 0 :(得分:0)

考虑一下,如果你有200 * 200阵列并且你想在每个阵列中加入一些新的实例,你必须在每个单元&#34;单元格中进行操作。 = 40000个细胞。无论优化如何,你都无法做到更好。

即使你没有for-cycle并且用

x[0][0] = ...
x[0][1] = ...

您仍然需要编写40000个命令

答案 1 :(得分:0)

生成的代码不会更快 - 生成的指令几乎相同;事实上,当打开编译器优化时,编译器可能很难有效地优化任一循环,因为它无法将它们识别为简单的循环。

绝大部分执行时间将用于分配新内存,并将指针写入pos_hint数组。实际上,一个潜在的改进确实会跳出来:目前,您正在访问map这样的数组:

map

等等。

这是不可取的,因为地址在内存中相距很远。以这样的方式访问内存总是更好,即彼此接近的地址在时间上彼此接近访问,因为这对缓存来说更友好。

因此,如果您要交换迭代轮次(例如map[0][0] map[1][0] map[2][0] ... map[0][1] map[1][1] map[2][1] ... map[0][2] ),那么可能会发现您的代码运行得更快 - 或者您可能不会;这一切都取决于机器的架构。