多维数组与平面数组 - 性能比较

时间:2013-11-14 08:59:43

标签: c++ c arrays performance

使用以下方法之一时是否存在任何性能问题?哪个更快(如果有的话)?如果有任何性能测试会很棒。

多方位数组:

// Using multidimmentional array:
int ****multidim_arr;
// ... initialization, etc. ...
int val = multidim_arr[a][b][c][d];

扁平阵列:

// Using flat array (or single array)
int *flat_arr;
// ... initialization, etc. ...
int val2 = flat_arr[a * a_lvl + b * b_lvl + c * c_lvl + d];

更新

数组具有固定大小,但内存由malloc()函数分配,因为在程序运行时已知大小。

2 个答案:

答案 0 :(得分:6)

与所有表现问题一样,简介并查看。但平板阵列很可能会更快。那是因为你没有将多维数组与平数数组进行比较 - 你将指向数组的指针数组与具有平面数组的数组进行比较。

多维数组将是int multidim_array[dim1][dim2][dim3][dim4]。这可以预期与平面阵列具有相同的速度。那是因为在内存中连续

另一方面,你的是基于指针,因此每个切片位于不同的内存位置,这意味着额外的提取,缓存未命中等。这几乎肯定会更慢。

答案 1 :(得分:3)

这取决于您如何迭代元素和大小。在这种情况下的性能很大程度上取决于缓存性能(命中/未命中率)。

很难概括。

“平面”数组往往更快,因为对元素的访问更直接。您计算一次索引。另外,“flat”我指的是连续内存块,其中arbiraty元素的索引可以在一个表达式中计算。我希望int a[X][Y][Z][W]int a[X*Y*Z*W]一样快,你手动获取索引的计算与compielr相同。

真正的区别在于int**** a;

使用多维“指针”数组。这实际上是高级指针引用,您需要在每个级别上获取适当的地址。在某些情况下,这会对性能产生很大影响。