1

高次元配列と 1 次元配列の使用効率に興味があります。次のように配列を定義して反復処理すると、何かが失われますか?

array[i][j][k];

または、次のように配列を定義して反復します。

array[k + j*jmax + i*imax];

違いはないだろうというのが私の傾向ですが、私はまだ高効率プログラミングについて学んでいます (これまで、この種のことを気にする必要はありませんでした)。

ありがとう!

4

5 に答える 5

1

確実に知る唯一の方法は、両方の方法でベンチマークを行うことです (もちろん、コンパイラで最適化フラグをオンにして)。2番目の方法で確実に失うと思うのは、読みやすさです。

于 2011-04-11T19:44:56.793 に答える
1

配列にアクセスする前者の方法と後者の方法は、一度コンパイルすると同じです。互いに近いメモリ位置にアクセスすると、異なる方法でキャッシュされるため、パフォーマンスに違いが生じることに注意してください。したがって、高次元の行列を保存する場合、その方法で行にアクセスする場合は、行を次々に保存するようにしてください。

一般に、CPU キャッシュは時間的および空間的な順序付けを最適化します。つまり、メモリ アドレス X にアクセスすると、X+1 にアクセスする可能性が高くなります。同じキャッシュ ライン内の値を操作する方がはるかに効率的です。

さまざまなストレージ ポリシーがパフォーマンスに与える影響の詳細については、CPU キャッシュに関する次の記事をご覧ください: http://en.wikipedia.org/wiki/CPU_cache

于 2011-04-11T19:47:35.793 に答える
1

インデックスを書き直すことができれば、コンパイラも書き直すことができます。私はそれについて心配しません。

あなたのコンパイラ(tm)を信頼してください!

于 2011-04-11T19:49:22.367 に答える
0

おそらく実装に依存しますが、多かれ少なかれ、1次元配列のコードに相当すると思います。

于 2011-04-11T19:46:57.730 に答える
0

コードをプロファイリングした後は、そのようなことに気を配ってください。そのようなことがアプリケーション全体のパフォーマンスに影響を与える可能性はほとんどありません。正しいアルゴリズムを使用することがはるかに重要です

たとえそれが問題になるとしても、注意が必要なのは、1 つの内部ループだけであることは間違いありません。

于 2011-04-11T19:48:16.657 に答える