1

以下の方法のいずれかを使用しているときにパフォーマンスの問題はありますか? どちらが速いですか (もしあれば)? パフォーマンステストがあれば素晴らしいでしょう。

多次元配列:

// 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() 関数によって割り当てられます。

4

2 に答える 2

7

すべてのパフォーマンスに関する質問と同様に、プロファイルを作成して確認してください。しかし、フラット配列の方が高速になる可能性は十分にあります。これは、多次元配列とフラット配列を比較していないためです。ポインターの配列とポインターの配列を比較しているため、フラット配列を含む配列と比較しています。

多次元配列はint multidim_array[dim1][dim2][dim3][dim4]. そして、それはフラットアレイと同じ速度を持つことが期待できます. それはメモリ内で連続しているからです。

一方、あなたのものはポインターに基づいているため、各スライスは異なるメモリ位置に存在します。これは、余分なフェッチ、キャッシュミスなどを意味します.これはほぼ間違いなく遅くなります.

于 2013-11-14T09:06:23.383 に答える
3

要素とサイズをどのように反復するかによって異なります。このような場合のパフォーマンスは、キャッシュのパフォーマンス (ヒット/ミス比) に大きく依存します。

一般化するのは非常に難しい。

「フラット」配列は、要素へのアクセスがより直接的であるため、高速になる傾向があります。インデックスを 1 回計算します。また、「フラット」とは、任意の要素のインデックスを 1 つの式で計算できる連続したメモリ ブロックを意味します。手動でインデックスを取得するために実行する計算は、コンパイラが行うのと同じですint a[X][Y][Z][W]int a[X*Y*Z*W]

本当の違いはint**** a;

多次元の「ポインタ」配列を使用。これは実際には高レベルのポインター参照であり、すべてのレベルで適切なアドレスをフェッチする必要があります。これは、場合によってはパフォーマンスに大きな影響を与える可能性があります。

于 2013-11-14T09:06:18.163 に答える