使用以下方法之一时是否存在任何性能问题?哪个更快(如果有的话)?如果有任何性能测试会很棒。
多方位数组:
// 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()函数分配,因为在程序运行时已知大小。
答案 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;
使用多维“指针”数组。这实际上是高级指针引用,您需要在每个级别上获取适当的地址。在某些情况下,这会对性能产生很大影响。