迭代 2D 结构时,迭代总长度更快还是使用嵌套循环迭代行和列更快?

Ril*_*azy -1 c++ optimization for-loop

我可以想到两种不同的方法来迭代二维范围,或者使用嵌套循环分别迭代行和列:

for (int i = 0; i < width * height; i++) {
    int x = i % width;
    int y = i / width;
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

或使用单个 for 循环迭代该区域并计算行和列:

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        //Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,宽度和高度可能非常大,因此我需要知道哪一个在大量迭代中表现更好。

for*_*818 5

width * height可能会溢出。有符号整数溢出(仍然)是未定义的行为。i % 0是未定义的行为。i / 0也是未定义的行为。您可以保护第一个版本免受此类问题的影响,尽管在第二个版本中不存在这些问题。

不要进行过早的优化。这:

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        //Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

height比平面循环更简单、更具可读性,而且最重要的是它是正确的(无论和 的值如何width)。

如果您确实关心性能,则应该首先编写正确且经过测试的代码,然后对其进行测量和分析。