ビルド時間の短縮についてメモする。
前提知識
コンパイル単位
当たり前のことですが、コンパイルは、ある一定の単位ごとに行われます。
この単位を「コンパイル単位」と呼びます。
コンパイル単位は、多くの場合、ソースファイルを指しますが、C/C++ のように別ファイルを取り込むような場合、その別ファイルを含めたソース全体がコンパイル単位となります。
当然ながら、コンパイル時間はソースが大きければ大きいほど長時間となります。
ライブラリにしてしまう。
効能
- 2回目以降のコンパイル時間を短縮できる。
方法
あまり編集しないモジュールをライブラリにしてしまいます。
これによって、そのモジュールはビルドしなくて済みますから、コンパイル時間は減らせます。
一方、リンク時間は増えますので、要実験です。
コンパイル単位を小さくする。
効能
- コンパイル時間を短縮できる。
方法
余計なファイルはコンパイル単位に含めないようにします。
C/C++であれば、必要のないヘッダは読み込まないようにします。
これには、一度ヘッダを削除してしまいコンパイルエラーになったシンボルを宣言しているヘッダだけを読み込むようにするのが有効です。
Pimpl イディオムを利用する
プリコンパイルヘッダを使用する
下記のコンパイラが対応しています。
- ARM CC
- Borland C++
- Digital Mars C++
- GCC/G++
- Microsoft Visual C++
ヘッダを読み込む側でインクルードガードする
長大なヘッダを読み込むと、ファイルを開いて、インクルードガードの末尾までシークして、ファイルを閉じるという操作が入る。
これを防ぐため、下記のようにヘッダを #include する側でインクルードガードを見るようにする。
#ifndef INCLUDED_STDIO_H #include <stdio.h> #define INCLUDED_STDIO_H #endif
「pragma once」を使用する
インクルードガードに比べて、ヘッダの末尾までシークする必要がないため若干高速になる。
が、所詮は、ファイルを開くという重い処理があるため、大差はない。
→Visual Studioでは、2回目以降のファイル自体を開かなくなるので高速。
http://msdn.microsoft.com/ja-jp/library/4141z1cx.aspx
インクリメンタルリンクを使用する
インクリメンタルコンパイルを使用する
マルチスレッド対応のコンパイラを使用する
分散ビルド対応のコンパイラを使用する
ツールを使用する
コンパイラ自体ではなく、補助ツールで分散ビルドを可能にしてくれたり、コンパイル速度を改善してくれるものもあります。
- distcc:分散ビルド
- ccache:コンパイル速度改善
- make -j: makeが並列ビルドしてくれます。
- IncrediBuild:分散ビルド
参考リンク
- http://journal.mycom.co.jp/news/2008/08/12/025/index.html
- http://msdn.microsoft.com/ja-jp/library/whs4y2dc%28VS.80%29.aspx
- http://d.hatena.ne.jp/mir/20070902/p1
- http://msdn.microsoft.com/ja-jp/library/aa664762%28VS.71%29.aspx
- http://www.game-create.com/archives/413
- http://sgry.jp/pgarticles/precompiled_header.html
- http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200712/07120032.txt
- http://proger.blog10.fc2.com/blog-entry-59.html