【问题标题】: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 次求和...
  • 不,不是!你问它是否可以忽略不计 - 如果我不同意在不运行代码的情况下计算相对性能,那么我不能更不同意尝试量化这种差异。

标签: c++ arrays indexing heap-memory


【解决方案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 分钟!谢谢!
    猜你喜欢
    • 2013-06-20
    • 2017-01-26
    • 1970-01-01
    • 2021-12-18
    • 2019-03-16
    • 2012-03-11
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多