堆上的二维数组,哪个版本更快?
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<std::vector<T>>
),并且还可以让你的生活更轻松,让你远离原始 -指针和手动内存管理。
【讨论】:
【参考方案2】:好的,我有:1000x1000 图像,在双数组上执行传统的傅立叶变换:Windows 7 Pro 64 位,VC++ 2010 Express -> 完全相同(2 分 11 分钟)!
【讨论】:
您是否启用了编译器优化?确保您没有在调试模式下编译。 @Manu343726:是的,我们开始了!在发布模式下(这意味着优化)第二版 1:44 分钟 vs 第一版 1:59 分钟!谢谢!以上是关于堆上的二维数组,哪个版本更快?的主要内容,如果未能解决你的问题,请参考以下文章