ビルド高速化してみた

数日前から作っていたミニゲームを公開。ソースもあるよ!

http://d.hatena.ne.jp/kyubuns/20110321/1300708060

というわけでソースに飛びついてきました。DirectXのコードは書いたことないのでちょっとわくわくします。しました。
だいぶ読みやすいコードだとは思うのですが、コンパイルの長いこと。i7でも一分かかってます。なんとかならないの?(バンバン
なんとかしました。

まずはビルド環境の構築

まず今日使う材料はこちら。適当なところで調達してきて下さいね。

ライブラリ類はプロパティシートでパスを切っておきましょう。Microsoft.Cpp.**.userというデフォルトのシート、もしくは新しく作っても構いません。
高速化するまえにビルドできることを確認。フルビルドに48秒でした。

マルチコアを活かす

さて、最近のCPU、それこそi7なんかではコア数が増えています。デフォルト設定のままだと直列にコンパイルされるので、マルチコアがあまり活かせていません。そこでプロジェクト設定を変更します。
プロジェクトのプロパティから[構成プロパティ][C/C++][全般]とたどり、[複数プロセッサによるコンパイル]を「はい」に変更します。
これで48秒→11秒。もう少し頑張りましょう。

プリコンパイル済みヘッダを使う

ソースを眺めてみると随所でStandard.hをインクルードしています。直接的・間接的合わせるとほとんどのソースがこのヘッダに依存しています。
このヘッダはWinSDK、DirectXSDK、Boost、STLといった多くのライブラリを一気にインクルードする物ですが、これらのヘッダはプリプロセス・コンパイルに時間がかかることでも有名です。それを数十あるソースが個別にインクルードするのはもったいないですね。
そこで一通り展開したヘッダ、プリコンパイル済みヘッダを使います。

  1. Standard.hをインクルードするだけのソース、Standard.cppを作成
  2. プロジェクトのプロパティ[構成プロパティ][C/C++][プリコンパイル済みヘッダー]で、[プリコンパイル済みヘッダー]を「使用(/Yu)」に変更、ファイルにStandard.hを設定
  3. Standard.cppのプロパティでも同じようにして[プリコンパイル済みヘッダー]を「作成(/Yc」に変更
  4. プロジェクト内の全.cppファイルの頭でStandard.hをインクルード

できあがり。
Standard.cppはプリコンパイル済みヘッダを生成するため、全ファイルでインクルードするのはお約束、といったところのようです。
これでStandard.hのプリプロセス処理が簡略化されるはずです。
結果は・・・11秒→5秒。きたあああああっ!

まとめ

を設定することでコンパイル時間が10分の1になりました。
今回は元からStandard.hをインクルードしていたファイルが多かったのでこうなりましたが、ヘッダがばらばらな場合など、プリコンパイル済みヘッダは必ずしも高速化できるとは言えない気がします。ケースバイケースで。
余談ですが、今回の記録はフルビルドした時の時間です。プリコンパイル済みヘッダは元になるヘッダが変更されない限り再利用できるので、実際には、例えばStandard.cpp以外全ファイルを変更しても3秒でコンパイルできます。あら素敵☆