C言語でモジュールを書いていて、直す→ビルド→直す→ビルド…を繰り返しているとビルドの待ち時間が増えてイライラということがよくあります。
そもそも「そんなにチマチマ直すな!」と言われればそれまでなのですが、一気に直してまとめて動作確認だと、バグっているときにどこが悪かったのか分からなくなるので、あまり好きではありません。
そんなこともあり、ビルドの時間をちょっとでも短くしたいなぁと思っていた矢先、ccacheなるツールの存在を知ったので使ってみることにしました(・∀・)
ccacheって何?
まずccacheって何?という話ですが、公式ページによると以下のように紹介されています。
ざっくりまとめると、「コンパイル時にキャッシュを作って、次のビルドはそのキャッシュを使って高速化する」ということだそうです。つまり、同じコードを繰り返しビルドするなら前の成果物を使いましょう、というものですね。
ccacheをインストール
今回はソースコードからccacheをインストールしてみます。2017/3/27の時点で最新は3.3.4でした。
$ cd ccache-3.3.4
$ ./configure
$ make
# make install
「ccaceh -s」のコマンドでキャッシュの統計情報が見れればOKです。もちろん、インストール直後はキャッシュがないのでどれも0になります。
cache directory /home/corgi/.ccache
primary config /home/corgi/.ccache/ccache.conf
secondary config (readonly) /usr/local/etc/ccache.conf
cache hit (direct) 0
cache hit (preprocessed) 0
cache miss 0
cache hit rate 0.00 %
cleanups performed 0
files in cache 0 ← キャッシュは空
cache size 0.0 kB
max cache size 5.0 GB ← キャッシュの最大サイズ(デフォルトは5GB)
ccacheの使い方
ccacheの使い方は大きく分けて2つあるようです。
ccacheでコンパイラをラップする
お手軽にccacheを使うならこの方法がオススメです。gccの先頭にccacheを付けて以下のような形でビルドします。
これだけで内部的にキャッシュを使ったビルドができるようになります。もちろん、最初の1回はキャッシュがないので高速化の効果はありません。
シンボリックリンクを張る
先の方法は明示的にccacheを有効にする方法でしたが、「いつでもccacheを有効にしたいんだ!」という場合には次のようにすればOKです。
gccの名前でccacheにシンボリックリンクを張るとそれ以降、gccを実行するだけで常にccacheが有効になります。
一度設定してしまえば良いので便利ではありますが、キャッシュを作るほどでもないプログラムでもキャッシュを作ってしまうため、パフォーマンス低下やストレージの圧迫がちょっと心配かも。
ホントに速くなるのか?
気になる効果を検証するために、今回はlighttpd(軽量httpサーバ)のビルド時間を計測してみました。lighttpdを選んだのは、それなりに大きくて複雑なプログラムの方が効果が見やすいと思ったからです。
条件 | ビルド時間 |
ccacheなし | 26秒 |
ccacheあり(1回目) | 25秒 |
ccacheあり(2回目) | 10秒 |
たしかに「ccacheあり」の時は2回目のビルドが約2.5倍に高速化できていることが分かります。より大きなプログラムだともっと顕著に効果が現れるかもしれません。
まとめ
実験により、ccacheによるビルドの高速化を確かめることができました。ある程度大きなプログラムでないと高速化の効果は薄いと思いますが、使い方によっては開発効率の向上に役立つと思います。
NFSにより複数台のPCでキャッシュを共有できる仕組みも備わっているため、チームでの開発にも導入できると幸せになれるかも。そちらは別の機会に試してみたいと思います(・∀・)
ではではノシ