1

たとえば 1000 行のコンピューター コードを使用し、変数を個別に宣言する代わりに、変数をクラスと構造体にグループ化すると (明らかに、これは使用される変数のサイズに依存します)、キャッシュの空間的局所性が直接増加します (したがって、キャッシュミス率を下げる)?

クラス/構造体内の変数を関連付けることで、連続したメモリアドレスが割り当てられるという印象を受けましたか?

4

3 に答える 3

2

この質問に答えるには、かなり不合理な仮定を立てる必要があります。空間的局所性は、データ構造と同じくらいアルゴリズムに関するものであるため、論理的に関連するデータ要素をグループ化しても、使用するアルゴリズムによっては、影響がないか、さらに悪化する可能性があります。

たとえば、3D 空間での 100 点の表現を考えてみましょう。それらを 3 つの個別の配列に入れるか、3 タプルの構造体/クラスを作成して、これらの配列を作成することができます。

アルゴリズムが各ステップで一度に各ポイントの 3 つの座標をすべて取得する必要がある場合は、タプル表現が優先されます。ただし、各次元で独立して動作するアルゴリズムを構築し、それを 3 つの独立したスレッド間で 3 方向に並列化するとどうなるか考えてみてください。この場合、3 つの別々の配列が有利です。なぜなら、そのレイアウトは偽共有を回避し、一度に 1 次元のアルゴリズムに関する限り、空間的局所性を改善するからです。

この例は、「万能」なソリューションがないことを示しています。空間的局所性は、特定のアルゴリズムのコンテキストで常に考慮する必要があります。あるケースでは良い解決策が、一見似たような別のケースでは悪くなる可能性があります。

于 2012-04-29T01:37:35.903 に答える
2

メソッドローカル変数について話している場合、それらはすでにスタック上で連続しているか、厳密に言えば、ほとんど常にスタック上にあるアクティベーション レコード内にあります。Java オブジェクトへの参照、または動的に割り当てられた C++ オブジェクトへのポインターについて話している場合、それらを含むクラスに配置しても、別の理由で違いはありません。関係するオブジェクトは、ヒープ内の任意の位置に残ります。

于 2012-04-29T01:40:26.293 に答える
2

ローカル変数を明示的に定義された構造にグループ化するかどうかを尋ねている場合、利点はありません。ローカル変数は、アクティベーション レコードの観点から実装されます。これは通常、両方を持つ言語のクラス構造の実装に密接に関連しています。

したがって、ローカル変数は、言語の実装がそれを台無しにするために何か奇妙なことをしていない限り、すでに適切な空間的局所性を持っているはずです。

再帰中に使用されないローカル状態の大きなチャンクを個別の非再帰関数に分離することで、局所性を向上させることができます。これはマイクロ最適化であるため、最初にマシン コードを調べて、時間の無駄ではないことを確認する必要があります。とにかく、地元の人をclass.

于 2012-04-29T01:43:47.777 に答える