一维数组映射方式的性能差异问题

Performance of differences 1-dimensional array mapping way issue

本文关键字:问题 性能 映射方式 一维数组      更新时间:2023-10-16

现在我要遵循以下主题

二维阵列与一维数组的性能

特别是,当我在我的代码中分配.cpp代码时。

实际上下面的方法非常慢,然后只是映射

1

int getIndex(int row, int col) return row*NCOLS+col;
#define NROWS 10
#define NCOLS 20
This:
int main(int argc, char *argv[]) {
int myArr[NROWS*NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[getIndex(i,j)] = i+j;
}
}
return 0;
}

阿拉伯数字

#define NROWS 10
#define NCOLS 20
This:
int main(int argc, char *argv[]) {
int myArr[NROWS*NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[row*NCOLS+col] = i+j;
}
}
return 0;
}

但我不明白为什么"1"比"2"慢?

在实验中,"1"几乎是"2"的两倍。 我认为这是没有道理的。

因为您没有启用优化。getIndex()足够小,可以(几乎可以肯定)内联。仅仅在Visual Studio上启用发布模式就使"慢速"版本变得如此之快,以至于我无法使阵列足够大来测量时间而不会遇到堆栈溢出。访问堆上的数组会扭曲测试结果,因此这不是一个选项。除此之外,您没有在代码中使用 2D 数组,它看起来像这样:int myArr[NROWS][NCOLS].
简单的数学(如i + j)很可能也不会成为代码中的瓶颈。如果它成为一个,你应该先寻找新的算法。例如:你真的需要遍历整个数组,还是其他不按索引访问数组的数据类型更合适?在极少数情况下,像这样的微优化是真正必要的。可能永远不会,如果您的数组大小为10*20个元素。

追求可读性,完成程序,分析它,然后欺骗该循环是否真的需要优化。

因为在第一个示例中使用函数,而在第二个示例中使用它内联。您可能知道,当程序调用函数时,它会保存其当前状态,然后再次返回。为此,它需要一点时钟周期。

所以根据您的代码。您的第一个示例通过调用函数使用一点位时钟周期,而不是第二个示例。因此,第二个可能比第一个更快。

在这里,您可以找到类似的逻辑:http://www.cplusplus.com/forum/articles/20600/