C++ のビルド高速化方法まとめ
C++ のビルド高速化について調査したことがあったので、その結果を残しておきます。
諸注意
- 効果についてはプロジェクト依存すると思います。あくまで目安程度にご覧ください。
- 一部 MSBuild 以外のビルド環境で検証したものもあります。VisualStudio で効果がなかったらごめんなさい。
方法一覧
種類 | 効果 | 方法 | 詳細 |
---|---|---|---|
ビルド時間全体 | ◎ | 並列実行をする | Visual Studio で並列実行したり、IncrediBuild を使ったりすることで、コンパイルを並列に実行し、全体のビルドを短くする。 |
ビルド時間全体 | ◯ | PC のディスクを高速にする | ビルド時の入力・出力があるディスクを SSD などにすることで、ファイル入出力に必要となる時間を短縮する。 |
ビルド時間全体 | ◯ | 一部のソースをライブラリにする | あまり編集しないモジュールをライブラリにして、常にビルドしないようにする |
コンパイル時間 | ◯ | 大量の cpp を1つの cpp にまとめる | 1つにまとめることで、ファイル入出力などや依存解決のプリプロセス時間を減らす。 |
コンパイル時間 | △ | ヘッダファイル検索順 | 使用頻度が高いヘッダファイルを早く読むようにシステムインクルードディレクトリなどの順番を変更することで高速化する。 |
コンパイル時間 | ◎ | プリコンパイル済ヘッダを使う | プリコンパイル済ヘッダを使い、使用頻度の高いヘッダをあらかじめ処理することで、時間短縮を見込める。 |
コンパイル時間 | △ | 最適化オプションを無効にする | 最適化オプションを無効にすることでコンパイル時最適化処理を行わなくなる。 |
コンパイル時間 | ◯ | ヘッダのリンクに気をつける | 不要なヘッダをリンクしない。hに他のhを極力リンクしないことで、依存が減りコンパイルを短くできる。( Pimpl イディオムなども有効) |
コンパイル時間 | △ | pragma once を使う | インクルードガードしてもヘッダの入出力は発生してしまうが、pragma once では2回めファイルを開かなくなるため有効。 |
リンク時間 | ◯ | 動的ライブラリにする | 静的ライブラリを動的にすることでリンク時間をなくす。 |
リンク時間 | ◎ | インクリメンタルリンクを使う | MSBuild のインクリメンタルリンクを使うことで差分リンクができリンク時間の短縮が見込める |