高次元配列と 1 次元配列の使用効率に興味があります。次のように配列を定義して反復処理すると、何かが失われますか?
array[i][j][k];
または、次のように配列を定義して反復します。
array[k + j*jmax + i*imax];
違いはないだろうというのが私の傾向ですが、私はまだ高効率プログラミングについて学んでいます (これまで、この種のことを気にする必要はありませんでした)。
ありがとう!
高次元配列と 1 次元配列の使用効率に興味があります。次のように配列を定義して反復処理すると、何かが失われますか?
array[i][j][k];
または、次のように配列を定義して反復します。
array[k + j*jmax + i*imax];
違いはないだろうというのが私の傾向ですが、私はまだ高効率プログラミングについて学んでいます (これまで、この種のことを気にする必要はありませんでした)。
ありがとう!
確実に知る唯一の方法は、両方の方法でベンチマークを行うことです (もちろん、コンパイラで最適化フラグをオンにして)。2番目の方法で確実に失うと思うのは、読みやすさです。
配列にアクセスする前者の方法と後者の方法は、一度コンパイルすると同じです。互いに近いメモリ位置にアクセスすると、異なる方法でキャッシュされるため、パフォーマンスに違いが生じることに注意してください。したがって、高次元の行列を保存する場合、その方法で行にアクセスする場合は、行を次々に保存するようにしてください。
一般に、CPU キャッシュは時間的および空間的な順序付けを最適化します。つまり、メモリ アドレス X にアクセスすると、X+1 にアクセスする可能性が高くなります。同じキャッシュ ライン内の値を操作する方がはるかに効率的です。
さまざまなストレージ ポリシーがパフォーマンスに与える影響の詳細については、CPU キャッシュに関する次の記事をご覧ください: http://en.wikipedia.org/wiki/CPU_cache
インデックスを書き直すことができれば、コンパイラも書き直すことができます。私はそれについて心配しません。
あなたのコンパイラ(tm)を信頼してください!
おそらく実装に依存しますが、多かれ少なかれ、1次元配列のコードに相当すると思います。
コードをプロファイリングした後は、そのようなことに気を配ってください。そのようなことがアプリケーション全体のパフォーマンスに影響を与える可能性はほとんどありません。正しいアルゴリズムを使用することがはるかに重要です
たとえそれが問題になるとしても、注意が必要なのは、1 つの内部ループだけであることは間違いありません。