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

时间:2017-05-18 08:16:40

标签: c++ c arrays

现在我想跟随以下主题

Performance of 2-dimensional array vs 1-dimensional array

特别是,当我在我的code.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;
}

2

#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;
}

但我无法理解为什么&#39; 1&#39;慢于&#39; 2&#39;?

在实验中,&#39; 1&#39;比#2;&#39;慢两倍。 我认为这没有道理。

2 个答案:

答案 0 :(得分:1)

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

为了可读性,完成程序,对其进行分析,然后在该循​​环真正需要优化的情况下进行欺骗。

答案 1 :(得分:0)

因为在第一个示例中您使用了一个函数,在第二个示例中,您使其成为内联函数。你可能知道当一个程序调用一个函数然后它保存它的当前状态,它再次返回。对于这项工作,它需要一个小时钟周期。

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

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