読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

ccache によるビルド高速化。実例として bitcoin のビルド速度は約30倍になりました。

gcc によるビルドを高速化するミドルウェアとして ccache というものがあります。
詳しい解説は以下が参考になるかと思います。

実導入例

インパクトのある効果例を先に示しておきます。
Amazon EC2 の t2.small (1 vCPU / Mem 2GB) インスタンスにおいて、ccache の無い状態、ccache の有る状態でそれぞれ3回ずつ bitcoin のビルドを試しました。

f:id:kobake:20170307163547p:plain:w500

ccache の無い環境では毎回 31 分程度のビルド時間が発生しています。
ccache の有る環境では初回のみ余計にビルド時間がかかっていますが、それ以降では 1 分程度のビルド時間となっており、大幅に時間短縮されたことが分かります。

理屈

例えばシンプルな例として gcc test.c というコマンドを実行することを考えてみます。

gccコンパイルの結果として a.out というファイルを出力するわけですが、このコマンド結果は何度実行しても変わりません。仮に test.c が数MBもの巨大なサイズを持っていたとしても、gcc は毎回毎回愚直に同じコンパイル処理を繰り返します。

コンパイル結果をキャッシュしておけば、大幅な出力速度の改善ができることは想像に難くないでしょう。(いろんな方式が考えられますが、たとえば対象ファイルのMD5ハッシュ値等と出力結果を紐づけた形で保管しておき、次回のコンパイル時に対象ファイルのハッシュ値が変わっていなければ前回のコンパイル結果をそのまま出力として流用する、等の方式はすぐに思い浮かぶかと思います)

ccache はざっくり言ってそのような(と簡単に言うと怒られそうですね。あくまでも考え方として解釈してください)キャッシング機構を提供します。

ccache 導入方法

ソースコードを入手し、ごく一般的なビルド&インストールの方法により導入できます。

$ wget https://www.samba.org/ftp/ccache/ccache-3.3.4.tar.gz
$ tar xzvf ccache-3.3.4.tar.gz 
$ cd ccache-3.3.4
$ ./configure
$ make
$ sudo make install

 
一応設置確認をしておきましょう。

# which ccache                                                                                 
/usr/local/bin/ccache

# ls -l /usr/local/bin/ccache
-rwxr-xr-x 1 root root 471150 Mar  6 19:34 /usr/local/bin/ccache

# ccache --version                                                                             
ccache version 3.3.4

ccache 利用方法 (自動)

拍子抜けするかもしれませんが、ccache が環境に入ってさえいれば、多くの C/C++ プロジェクトでは ccache を自動で利用する形で構成されています。

なので ccache のインストールさえ完了していれば、例えば bitcoin 等を「普通の手順で」ビルドするだけで ccache が利用された形の高速なビルドが走ることになります。

具体的にはプロジェクトのビルドの ./configure の段階で

....
checking for ccache... /usr/local/bin/ccache
....

という検出過程を目にすることができるはずです。

ccache 利用方法 (手動)

あまり手動でこれを打ち込む場面は無いと思いますが、一応解説しておくと

$ gcc test.c

というコマンドでビルドするところを

$ ccache gcc test.c

のように頭に ccache を挿入した形のコマンドにすることで、ccache によるキャッシュ機構でラップされた形で gcc コンパイルを行うことができます。

ccache のキャッシュ置き場や設定ファイル等

~/.ccache ディレクトリがキャッシュ置き場および設定ファイル置き場として利用されます。

設定ファイルは ~/.ccache/ccache.conf として設置されています。

max_size = 5.0G

max_size の設定値によりキャッシュ容量の上限を設定することができますが、大抵はデフォルト値のままで困ることはないかと思います。

キャッシュの完全クリア

以下コマンドによりキャッシュを完全にクリアすることができます。

$ ccache -C

おしまい

ccache の導入は簡単で、デメリットもそれほど大きくないように見える(初回のキャッシュ構築にほんの少し時間を食うのと、ディスク容量が少し消費されるくらい)ので、開発マシンには最初から入れておいて損の無いツールかと思います。

ただし落とし穴が無いとは言い切れないので、何かおかしいな?と思ったら ccache -C するとか ccache そのものを一旦アンインストールしてみるとか、そういうアレコレが必要な場面はあるかもしれません。そのあたりは自己責任でお願いします。

チーム開発の際にはキャッシュをチームで共有することでさらなる効率化も図れるみたいですが、今のところ僕にはまだ必要な場面が訪れて無いので試してないです。

});