ccache (compiler cache)とは?
Wikipedia より
ccacheとは、CまたはC++コンパイラが出力するデータをキャッシュするソフトウェア開発ツールである。その目的は、2回目以降のソフトウェアビルドにおいてはコンパイルを避け、出力結果を再利用することにある。これは再コンパイル速度を劇的に改善する。このツールはコンパイラがソースコードをコンパイルする際の処理に割り込み、コンパイル時に固有であるべき各種データのハッシュ値を生成する。この付加的な処理により、概ね1度目のコンパイルはキャッシュを実行しない場合に比べ、コンパイルに時間がかかる。2度目以降のコンパイルでは再度ハッシュを生成し、その値がキャッシュデータのものと一致するかチェックする。一致すればccacheはコンパイラにコンパイルを指示する代わりにキャッシュされたデータを書き出す。一致しなければ、コンパイル処理はコンパイラに渡される。
つまり ccache とは、
- C, C++ のビルド高速化ツール
- 初回ビルドはそのまま。結果をキャッシュに持っておく。
- 2回目以降のビルドは再利用できるならコンパイルせず、キャッシュからコピーするのみ
- 再利用できないときは普通にコンパイル。結果はキャッシュへ。
という仕組み。
使い方
インストール
Ubuntu14.04 の場合。
$ sudo apt-get install ccache
設定
使用宣言
$ vi ~/.bashrc
# --- 追記ここから ---
export USE_CCACHE=1
export CCACHE_DIR=/root/.ccache
# --- 追記ここまで ---
$ export set CC='ccache gcc'
設定確認
$ ccache -s
cache directory /home/<user>/.ccache
cache hit (direct) 0
cache hit (preprocessed) 0
cache miss 0
files in cache 0
cache size 468 Kbytes
max cache size 1.0 Gbytes
キャッシュサイズ設定
$ ccache -M 10G
$ ccache -M 100M
お好みで。
キャッシュ削除
$ ccache -C
実行
有効になっているので、そのまま make してください。
高速化状況
ccache 公式サイトの情報
https://ccache.samba.org/performance.html
にパフォーマンス結果が載っています。
Elapsed time | Percent | |
---|---|---|
Without ccache | 367.11 s | 100.00 % |
ccache first time | 385.67 s | 105.06 % |
ccache second time | 9.70 s | 2.64 % |
自らの ccache.c のビルド時間と高速化率とのことです。
ccache 未使用のデフォルトを100%としたとき、
初回のビルドはビルド時間が105%になりますが、
2回目以降は3%になるとのことです。
# direct mode と preprocessor mode の結果の違いは端折ります。
# direct mode = ヘッダとソースファイルからハッシュを作りリビルドするか判断。デフォルト。
# preprocessor mode = プリプロセッサも通してからリビルドするか判断。 direct mode より時間がかかる。
私の手元の情報
私もビルド時間を計測してみました。
某 OSS ビルド時、初回は約2時間、 ccache 適用後は約5分になりました。
1回目
$ time make
real 115m17.953s
user 752m1.909s
sys 72m50.983s
2回目
$ time make
real 4m56.688s
user 14m37.291s
sys 4m38.293s
Tips
- cache directory は読み書き早めの SSD にする
- キャッシュサイズは十分に。一回ビルドして限界値に達しているなら足らないので増やしましょう
まとめ
- ccache とは C, C++ のビルド高速化ツール
- 初回は多少ビルド時間が長くなるが、2回目以降は劇的に早くなる
参考
ccache 公式サイト: https://ccache.samba.org/
ccache 公式マニュアル: https://ccache.samba.org/manual.html