9

通常のオブジェクト指向の慣行では、まれなオブジェクトが複数の無関係なメンバー プロパティを持つことはありません。また、オブジェクトが処理されている場合、それらのプロパティのさまざまな部分を対象とするさまざまなパスで処理が行われることも珍しくありません。

この点で、オブジェクトのコレクションを作成する典型的なアプローチは、あまり効率的ではないようです。コンピュータがメモリにアクセスする方法とキャッシュ ラインの平均サイズを考慮すると、キャッシュ メモリが不要なものでいっぱいになる可能性が非常に高くなりますが、たまたま隣接しているだけなので、キャッシュの容量が浪費され、ストールが追加されます。そして実行までの待ち時間。

さらに悪いのは、メモリ プールやカスタム アロケータを使用せずに、ポリモーフィズムを使用してオブジェクトを動的に割り当てる慣行です。この場合、キャッシュが不要なデータでいっぱいになるだけでなく、動的メモリ割り当てによって使用される任意のアドレスが原因で、プリフェッチャーも適切に機能しなくなります。

救いは、OOP以前の時代に戻ってデータ指向を選択することです。これは、パフォーマンスが重要なアプリケーション、オペレーティングシステムなどの開発の好みの選択であるようです. しかし、なぜこの 2 つのハイブリッド バージョンを使用しないのでしょうか。データ指向オブジェクトプログラミングの一種?

長い序曲の後、当面の問題に取り掛かりましょう。私はこの概念の効率をテストするのに十分な大規模なプロジェクトを持っていないので、コミュニティの理論的な専門知識は大歓迎です.

オブジェクトが独自のデータ メンバーを格納するのではなく、コレクションへの参照のみを格納し、データ メンバーが独自のコンテナーに順番に格納され、メンバー メソッドがそれらのコンテナーからデータを返すようにすると、不要なデータが終了する可能性がなくなります。 CPU に到達するまでの時間を減らす必要があり、近い「将来」に必要なデータの可能性が高くなります。論理的な前提として、このアプローチはプリフェッチャーの効率、キャッシュ ヒット、および使用効率を改善し、自動および手動の並列化に関連するレイテンシも削減します。

どう思いますか?

後半の編集:「データ指向パターン」の適用は、構造体とクラスのパディングを考慮に入れるとさらに有益になる可能性があります。「モデル」にデータメンバーcharintデータメンバーがある場合、OOP 方式でパディングされ、汚染するだけです。さらにキャッシュしますが、データ指向のストレージ モードではchar、すべての とすべてintの を順番に格納でき、スペースもキャッシュもまったく無駄になりません。

4

2 に答える 2

0

まず、素晴らしいスライド プレゼンテーションです。私が理解できるように、あなたの質問はプレゼンテーションのアプローチとはかなり異なっています。変数は、オブジェクトの属性も含め、メイン メモリにランダムに格納されます。連続したデータ構造体にメモリを割り当てようとすると、データ構造体のサイズはメイン メモリ内の最大の「気泡」によって制限されます。たぶん、あなたは次のようなことを考えました:

class MyClass
{
public:
    MyClass()
    {
        m_dataMembers = new GenericObject[DATA_MEMBERS_AMOUNT];

        //initialize array values...
    }

    int getMyVar()
    {
        return (int)m_dataMembers[MY_VAR_INDEX];
    }

    //others functions...

private:
    GenericObject* m_dataMembers;
}

このように、いくつかの問題が発生します。まず、あらゆる種類の変数を格納するための汎用オブジェクト クラスが必要です。次に、各変数がデータ構造のどこに配置されているかを知る必要があります。次に、ゲッターで正しく変換するために、データ構造の各変数の型を知る必要があります。彼がプレゼンテーションで実際に行っていることは、参照を使用してクラスのサイズを縮小し、キャッシュ ページにうまく収まるようにし、メイン メモリではなくキャッシュの使用量を減らすことです。誤解していないことを願っています。

于 2012-09-11T14:53:20.610 に答える