性能差异一维数组映射方式问题 [关闭]

Posted

技术标签:

【中文标题】性能差异一维数组映射方式问题 [关闭]【英文标题】:Performance of differences 1-dimensional array mapping way issue [closed] 【发布时间】:2017-05-18 08:16:40 【问题描述】:

现在我要关注以下主题

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;

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

在实验中,“1”比“2”慢了近两倍。 我认为这是没有意义的。

【问题讨论】:

您是否在启用优化的情况下进行编译? 什么优化级别?而且数组很小,你是如何测试性能的? @amel 这就是为什么。 我在这里没有看到任何二维数组。 你是如何测量执行时间的?你能提供一个minimal reproducible example吗? 【参考方案1】:

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

【讨论】:

为什么堆数组会改变结果?只需在开始秒表之前分配它:) 你是对的,只有(取消)分配应该有所作为。改了。【参考方案2】:

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

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

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

【讨论】:

您将高级概念(函数调用)等同于低级推测(函数的代码是否内联)。分析未优化的构建毫无意义——您链接的文章充满了错误。

以上是关于性能差异一维数组映射方式问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将二维数组映射到一维数组

映射/绘制一维数组/系列中值的距离

一维到二维数组[关闭]

使用共享内存对三维数组的一维求和

C语言中怎么把一维数组赋给另外一个一维数组

01背包_顺序枚举和逆序枚举的问题_一维数组