最新のPCでのC ++の効率

サイズの制限を考慮して、注釈付きのリンクとしてではなく、記事の形でメモを公開しています。


C ++が設計されて以来、相対的な(RAMの速度に対する)プロセッサ速度は400倍になりました。 さらに、プロセッサにはコード内に大きなキャッシュと分岐予測があります。 これらすべてが最も深刻な方法で組み合わされると、最新のプラットフォームでのC ++の効率に影響します。 以下に注釈といくつかのリンクを示します。これらの事実を使用してコードの効率を改善することが提案されています。





問題のステートメントは、この記事で私に会った:

solid-angle.blogspot.com/2010/02/musings-on-data-oriented-design.html



また、レポートと記事を注意深く読むことをお勧めします。リンクは最初に著者によって公開されています。 このレポートは、具体的な数値の観点から最も有益であり、示唆的なものです。

research.scee.net/files/presentations/gcapaustralia09/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf

3次元グラフィックスオブジェクトの例を使用して、C ++の観点から最も単純な変更(たとえば、クラスヘッダー内の宣言の再配布)がコードの速度を大幅に向上させる方法を示します。



この記事の著者は、データに基づいてコードを作成する必要性について語り、その後にのみOOP(データ指向設計)の抽象化について説明します。 メモリとプロセッサの速度の違いの変化を考えると(何百回も思い出します!)、これにより、現代のシステムでのコードの作業をグローバルに高速化できます。 簡単に言えば、このアプローチは次のことを示唆しています。

1)類似の要素が多数ある場合に、単一のデータ要素で機能する関数の拒否

2)メモリ内の独立した連続配列としてのこれらの要素の編成、およびこの配列で直接動作するメンバー関数。



作成者が書いているように、PCの観点から見ると、さまざまなタイプの情報は、データタイプごとに1つの同種の配列に整理する必要があります。 アセンブラー(または他の低水準言語)レベルでは、処理単位が配列またはそれらのセットでなければならないような方法で関数を生成する必要があります。 同時に、ある人(たとえば、デバッグ中)には、このデータをクラスにグループ化する必要があります(つまり、現代のC ++の通常の方法)。そのデータは、低レベルの同種配列の異種要素セットです。 これにより、コードを1桁(場合によってはそれ以上)スピードアップできます。



PS一部の人にとって、データ指向設計の概念は新しいものではないかもしれません。 このアプローチとそのアプリケーションの特定の結果を実装した経験がある可能性があります。 コメントで同様の最適化を行った経験を共有すると、非常に興味深いでしょう。



All Articles