通常のオブジェクト指向の慣行では、まれなオブジェクトが複数の無関係なメンバー プロパティを持つことはありません。また、オブジェクトが処理されている場合、それらのプロパティのさまざまな部分を対象とするさまざまなパスで処理が行われることも珍しくありません。
この点で、オブジェクトのコレクションを作成する典型的なアプローチは、あまり効率的ではないようです。コンピュータがメモリにアクセスする方法とキャッシュ ラインの平均サイズを考慮すると、キャッシュ メモリが不要なものでいっぱいになる可能性が非常に高くなりますが、たまたま隣接しているだけなので、キャッシュの容量が浪費され、ストールが追加されます。そして実行までの待ち時間。
さらに悪いのは、メモリ プールやカスタム アロケータを使用せずに、ポリモーフィズムを使用してオブジェクトを動的に割り当てる慣行です。この場合、キャッシュが不要なデータでいっぱいになるだけでなく、動的メモリ割り当てによって使用される任意のアドレスが原因で、プリフェッチャーも適切に機能しなくなります。
救いは、OOP以前の時代に戻ってデータ指向を選択することです。これは、パフォーマンスが重要なアプリケーション、オペレーティングシステムなどの開発の好みの選択であるようです. しかし、なぜこの 2 つのハイブリッド バージョンを使用しないのでしょうか。データ指向オブジェクトプログラミングの一種?
長い序曲の後、当面の問題に取り掛かりましょう。私はこの概念の効率をテストするのに十分な大規模なプロジェクトを持っていないので、コミュニティの理論的な専門知識は大歓迎です.
オブジェクトが独自のデータ メンバーを格納するのではなく、コレクションへの参照のみを格納し、データ メンバーが独自のコンテナーに順番に格納され、メンバー メソッドがそれらのコンテナーからデータを返すようにすると、不要なデータが終了する可能性がなくなります。 CPU に到達するまでの時間を減らす必要があり、近い「将来」に必要なデータの可能性が高くなります。論理的な前提として、このアプローチはプリフェッチャーの効率、キャッシュ ヒット、および使用効率を改善し、自動および手動の並列化に関連するレイテンシも削減します。
どう思いますか?
後半の編集:「データ指向パターン」の適用は、構造体とクラスのパディングを考慮に入れるとさらに有益になる可能性があります。「モデル」にデータメンバーchar
とint
データメンバーがある場合、OOP 方式でパディングされ、汚染するだけです。さらにキャッシュしますが、データ指向のストレージ モードではchar
、すべての とすべてint
の を順番に格納でき、スペースもキャッシュもまったく無駄になりません。