爆速C++を極める!効率的なコードを書くための実践テクニック(2013年版)
Writing Efficient C++ Code (2013)
Writing Efficient C++ Code (2013)
C++における効率的なコード記述手法に関する技術まとめです。パフォーマンスを最大限に引き出すための最適化のヒントや、メモリ管理、実行速度向上のためのベストプラクティスが網羅されています。2013年の公開から時間が経過していますが、現代のC++開発においても基礎となる重要な知見が多く含まれています。
「この記事は元々2013年第4号のポーランド語版で発行されました」——素晴らしいアドバイスが詰まってるね。C++がここ10年で、効率的でシンプルな低レイヤーコードを書くことをどんどん難しくする方向へ進んでしまったのは悲しいな :(
C++はほぼ毎日書いてるけど、速度のために最適化する必要に迫られたことは一度もないな。素直なコードを書くだけでも、元々めちゃくちゃ速いからね。
分岐予測、コンテキストスイッチ、同期についての言及がないね。何をするかによっては、これらは非常に重要になり得るのに。スレッドやSIMDを使った並列化についても、ごく簡単に触れられているだけだ。
ハイパフォーマンス・プログラミングは巨大なトピックだよ。ひとつのブログ記事に収めるには範囲が広すぎるし、C++やコンピュータアーキテクチャの議論が表面的なものになるのは仕方ないね。内容自体は悪くないと思うけど、フォーマットが合っていない気がする。ブログシリーズか、いっそ書籍にした方が適切だったんじゃないかな。
最新のC++プロジェクトで保険のリスク計算みたいなアクチュアリー的なことを扱う評価エンジンを作ってるんだけど、16コアのサーバーでバルク計算のパフォーマンスは毎秒数千万件の評価に達するよ。秘訣は、DSLで書かれたルールをJITコンパイルして実行可能コードに変換しているところかな。インタープリタモード(主に監査用)だと3〜5倍遅くなるけど、それでも十分爆速だよ。
AIとかLLMってPythonがメインだと思ってたけど、違うの?
この記事、2000年代に見始めたパフォーマンスのアドバイスを思い出すよ。基本的には、アルゴリズムの複雑さを下げるためにポインタだらけのデータ構造を導入するな、って話だね。全部ベクトルに詰め込めばいい。コンピュータサイエンスの教科書なら「遅い」と言われるアルゴリズムを使うことになっても、すべてキャッシュに収まるなら関係ないんだ。あちこちポインタを追いかけてキャッシュミスする方がよっぽどダメージ大きいからね。
ついでに聞きたいんだけど、GCが必要な環境でのデータ指向設計(DoD)について書かれたリソースってどこかにある?DoDってアリーナ(メモリプール)中心の話が多いけど、コードのライフサイクル的にGCが必要な場合は必ずしもそうとは限らないしね。
DoDのムーブメントはシステムプログラミングのやり方を大きく変えつつあると思うけど、いろんなシナリオに応用するための材料がまだ足りていない気がする。自分の仕事(これもC++)でももっと活用したいんだけど、紹介されている理論と実際の応用の間にギャップがあるんだ。
具体的には、Clojure方言の動的プログラミング言語ランタイムをC++で開発してるんだけど、このランタイムはGCが必須で、型消去が求められるし、高度にポリモーフィックである必要がある。だからSoAやAoSをすべてに適用するのは無理なんだ。コンパイラやランタイム、エスケープ解析による生成コードで可能な限りGCを避けることはできるけど、システムの80%以上を占める他の部分は?このランタイムがDoDと相性が悪すぎるだけかもしれないけど、白か黒かではなくグラデーションとして捉えるべきだと思ってるよ。
C++のvolatileキーワードは、コンパイラが値をレジスタに保持するのではなく、毎回メモリからフェッチするように最適化を抑止するために使われると知っている
いや、それは誤解だよ。volatileの意味はもっと複雑で繊細なものだ。
ほとんどの場合、パフォーマンスの改善は微々たるもので、ただコードが複雑になるだけだったな。
「時期尚早な最適化は諸悪の根源」だね。