[解決済み] なぜキャッシュの局所性がアレイの性能に影響するのか?
質問
次のような ブログ には、リンクリストに対する配列の優位性についての記述があります。
配列はより良いキャッシュの局所性を持っており、パフォーマンスにおいてかなり大きな違いを生み出すことができます。
どういう意味ですか?キャッシュの局所性がどのように大きなパフォーマンス上の利点をもたらすのか理解できないのですが。
どのように解決するのですか?
私の回答を参照してください。 空間的および時間的な局所性について .
特に、配列は連続したメモリブロックなので、大きな塊は最初のアクセスでキャッシュにロードされます。 このため、配列の将来の要素にアクセスするのが比較的速くなります。 一方、リンクリストは必ずしも連続したメモリブロックではないので、キャッシュミスが多くなる可能性があり、アクセスにかかる時間が長くなります。
以下のような配列のメモリレイアウトを考えてみましょう。
data
とリンクされたリスト
l_data
大きな構造体の
Address Contents | Address Contents
ffff 0000 data[0] | ffff 1000 l_data
ffff 0040 data[1] | ....
ffff 0080 data[2] | ffff 3460 l_data->next
ffff 00c0 data[3] | ....
ffff 0100 data[4] | ffff 8dc0 l_data->next->next
| ffff 8e00 l_data->next->next->next
| ....
| ffff 8f00 l_data->next->next->next->next
この配列をループする場合、最初のアクセスは
ffff 0000
への最初のアクセスでは、メモリにアクセスして取り出す必要があります(CPU サイクルでは非常に遅い処理です)。 しかし、最初のアクセスの後、配列の残りの部分はキャッシュに格納され、その後のアクセスははるかに速くなります。 リンクリストの場合、最初のアクセスは
ffff 1000
への最初のアクセスも、メモリに移動する必要があります。 残念ながら、プロセッサはこの場所を直接囲むメモリをキャッシュし、例えば
ffff 2000
. 見ての通り、これは実際にはリストの他のどの要素も捕捉しません。
l_data->next
にアクセスしようとすると、またもやメモリにアクセスしなければならないことになります。
関連
-
[解決済み】IndexError: Index 10 is out of bounds for axis 0 with size 10
-
[解決済み] glVertex3fvとglVertex3fの相違点
-
[解決済み] 選択ソートが安定する理由と不安定な理由
-
[解決済み] Powershellで配列の値をソートする
-
[解決済み】GCC: 配列の型が不完全な要素型である
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] w(array)とはどういう意味ですか?
-
[解決済み] リンクリストの途中への挿入はなぜO(1)なのか?
-
[解決済み] TypeScriptの配列を文字列リテラルに変換するタイプ
-
[解決済み] Goで配列をシャッフルする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】IndexError: Index 10 is out of bounds for axis 0 with size 10
-
[解決済み] Swift Closuresの$0と$1の意味は何ですか?
-
[解決済み] MIPSの2Dアレイ
-
[解決済み] 配列をヒープ化するためのヒープにおけるsiftUp, siftDown操作
-
[解決済み] Postgres の配列の NOT
-
[解決済み] 配列のインデックスやキーをチェックする最も簡単な方法とは?
-
[解決済み] Linux Bashでlsを配列に割り当てるには?
-
[解決済み] Goで配列をシャッフルする
-
[解決済み] VBAの配列ソート機能?
-
[解決済み] Swiftで空の配列の辞書を初期化する