堆上的二维数组,哪个版本更快?

Posted

技术标签:

【中文标题】堆上的二维数组,哪个版本更快?【英文标题】:2-dimensional array on heap, which version is faster? 【发布时间】:2014-01-03 02:02:04 【问题描述】:
double **array = new double* [X];
for (int i=0; i<X; i++)
    array[i] = new double [Y];

array[x][y] = n;

double *array = new double [X*Y];

array[x*Y+y] = n;

第二个版本的创建速度更快,但第一个版本的访问速度更快(例如使用卷积的图像处理),不是吗?还是这一切都可以忽略不计?

【问题讨论】:

使用代表性数据运行它们,对它们进行计时并查看。您无法通过读取代码来可靠地预测性能,有太多因素在起作用,例如编译器、编译器的配置方式、缓存效果等。 *(array+(x*Y+y))*(*(array+x)+y) 不可预测? 2 次求和 + 1 次乘法 + 1 次解引用与 2 次递减 + 2 次求和... 不,不是!你问它是否可以忽略不计 - 如果我不同意在不运行代码的情况下计算相对性能,那么我不能更不同意尝试量化这种差异。 【参考方案1】:

理论上第二个版本应该更快,因为整个数组是连续分配的,所以它比第一个对缓存更友好。

但在实践中,对其进行分析,看看会发生什么。这类性能问题在很大程度上取决于您的架构、操作系统等。

我在这里的建议(除了分析之外)是:考虑使用已经过分析、测试的标准容器(在这种情况下为 A std::vector&lt;std::vector&lt;T&gt;&gt;),并且还可以让你的生活更轻松,让你远离原始 -指针和手动内存管理。

【讨论】:

【参考方案2】:

好的,我有:1000x1000 图像,在双数组上执行传统的傅立叶变换:Windows 7 Pro 64 位,VC++ 2010 Express -> 完全相同(2 分 11 分钟)!

【讨论】:

您是否启用了编译器优化?确保您没有在调试模式下编译。 @Manu343726:是的,我们开始了!在发布模式下(这意味着优化)第二版 1:44 分钟 vs 第一版 1:59 分钟!谢谢!

以上是关于堆上的二维数组,哪个版本更快?的主要内容,如果未能解决你的问题,请参考以下文章

通过后续索引扫描二维数组并不总是更快吗?

用指针实现二维数组行列求和

c语言 输出二维数组任意行任意列元素的值

20150423函数指针

20150423函数指针

JAVA中如何对二维数组的每一列进行排序