C++の高速化は言語選びでは決まらない、データ指向設計がカギ

Writing Efficient C++ Code

C++の高速化は言語選びでは決まらない、データ指向設計がカギ

C++はハイレベルとローレベルの両面を持つが、効率的なコードを書くには言語の知識だけでは不十分だ。データ指向設計(DOD)は、メモリ配置やデータ構造を優先し、キャッシュミスを減らす。オブジェクト指向の過剰な抽象化は実行時オーバーヘッドを生む。シンプルな設計が読みやすく高速なコードにつながる。

キャッシュの恩恵を受けるには、頻繁に一緒に使われる値が互いに隣り合うようにメモリ内でデータを配置すべきです。
  1. Jeaye

    ついでに聞きたいんだけど、GCが絡む場合のデータ指向設計に関するリソースを誰か見たことある?データ指向設計の多くはアリーナに焦点を当てているけど、コードのライフタイムモデルが(何らかの理由で)GCを必要とする場合、それが常に可能とは限らない。

    DoDのムーブメントはシステムプログラミングのやり方を変える、ゆっくりだが大きな変化だと思う。ただ、さまざまなシナリオでこれをどう実践するかについての資料はまだ十分ではない。自分の仕事の領域(これもC++)にもっと適用したいと思っているけど、彼らが提示している内容と、それをどう応用できるかの間にはギャップがあるように感じる。

    もっと具体的に言うと、私はC++を使ってClojure方言の動的プログラミング言語ランタイムを構築している。そのランタイムはガベージコレクションされ、型消去され、高度に多相的であることが求められる。だから、すべてをSoAやAoSにできるわけではない。確かに、データをパックできるし、コンパイラ/ランタイムコードと生成コードの両方でエスケープ解析を通じて可能な限りGCを避けることもできる。でも、それ以外の、システムの80%以上を占める部分はどうする?このランタイムはDoDとは相容れないのかもしれないが、私は物事を白黒ではなくグラデーションとして捉えている。

  2. asveikau

    この記事は、2000年代に私が見始めたパフォーマンスに関するアドバイスを思い出させる。要は、アルゴリズムの複雑さを下げるためにポインタを多用したデータ構造を導入するなということだった。全部をvectorに詰め込め。計算機科学の教科書が遅いと言うアルゴリズムを使うことになるかもしれないが、すべてキャッシュに収まるなら問題ない。ポインタをあちこち追いかけることによるキャッシュミスの方が、はるかに痛い。

  3. hn_submit

    私はほぼ毎日C++で書いているが、速度を最適化する必要に迫られたことはない。素直なコードを書いても、すでに驚くほど速い。

  4. MaxBarraclough

    分岐予測やコンテキストスイッチ、同期については一切触れられていない。何をしているかによっては、それらは非常に重大な影響を及ぼす可能性がある。スレッドによる並列化やSIMDについてもごく簡単に触れられているだけだ。

    高性能プログラミングは大きなトピックだ。単一のブログ記事には範囲が広すぎて、C++とコンピュータアーキテクチャについて当然ながら表面的な議論しかできない。それを考慮すれば記事は悪くないが、フォーマットが間違っていると思う。ブログシリーズ、あるいは本の方がふさわしいだろう。

  5. 112233

    「この記事は元々ポーランド語で2013年4/2013号に掲載された」——素晴らしいアドバイスがたくさんある。C++がこの10年で、効率的でシンプルな低レベルコードを書くのをどんどん難しくする方向に進んでしまったのを見るのは悲しい :(

この日のほかの記事

2026-09-27