簡體   English   中英

多維陣列與平面陣列-性能比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM