[英]Multidimmensional array vs flat array - performance comparison
使用以下方法之一時是否存在任何性能問題? 哪個更快(如果有)? 如果有任何性能測試,那就太好了。
多維數組:
// 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()函數分配的,因為在程序運行時大小是已知的。
與所有性能問題一樣,剖析並查看。 但是,很可能扁平陣列會更快。 那是因為您沒有將多維數組與平面數組進行比較-您將指針數組與...的指針數組與具有平面數組的數組進行了比較。
多維數組將為int multidim_array[dim1][dim2][dim3][dim4]
。 並且可以預期它具有與平面陣列相同的速度。 那是因為那在內存中是連續的。
另一方面,您的指針基於指針,因此每個分片位於不同的內存位置,這意味着額外的提取,高速緩存未命中等。這幾乎肯定會比較慢。
這取決於您如何遍歷元素和大小。 在這種情況下,性能很大程度上取決於緩存性能(命中率/未命中率)。
很難一概而論。
因為對元素的訪問更直接,所以“平面”數組往往會更快。 您只需計算一次索引。 同樣,“扁平”是指連續存儲塊,其中可以在一個表達式中計算元素的索引。 我希望int a[X][Y][Z][W]
與int a[X*Y*Z*W]
一樣快地工作,您為手動獲取索引而執行的計算與compielr相同。
真正的區別是int**** a;
具有多維“指針”數組。 這實際上是高級指針引用,您需要在每個級別上獲取適當的地址。 在某些情況下,這可能會嚴重影響性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.