Using ccache to speedup compilation of C/C++


ccache is a utility that caches intermediate files during compilation offering significant speedups. It is especially useful if you are switching between two branches of the same project see below.

To use it, prepend it before the compiler i.e. Use ccache gcc instead of gcc ... . If you are using cmake with a version greater that 3.4 you can use the option -DCMAKE_CXX_COMPILER_LAUNCHER=ccache for older version you can modify the compiler settings or use the variable RULE_LAUNCH_COMPILE for more see here.

Example :

Lets try it on the source code of cmake:

First without ccache

$ git clone https://gitlab.kitware.com/cmake/cmake
$ mkdir build
$ cd build
$ cmake ../cmake
$ time make -j
real	7m29.921s
user	25m56.556s
sys	1m46.428s

We switch to another branch and try again:

$ cd ../cmake
$ git checkout v3.15.0
$ cd ../build
$ cmake ../cmake
$ time make -j
real	5m47.679s
user	20m17.790s
sys	1m23.828s

These are our baselines.

Switching back to master and recompiling requires the same time:

$ cd ../cmake
$ git checkout master
$ cd ../build
$ cmake ../cmake
$ time make -j
real	7m29.399s
user	25m56.187s
sys	1m46.214s

Now we enable ccache on a clean build

$ rm -rf ./build/*
$ cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ../cmake
$ time make -j
real	8m32.952s
user	27m36.442s
sys	2m12.991s

There is a slight increase in compilation time. The same when we switch for first time to another branch:

$ cd ../cmake
$ git checkout v3.15.0
$ cd ../build
$ cmake ../cmake
$ time make -j
real	6m42.900s
user	21m48.924s
sys	1m44.644s

However, now that we have populated our cache, builds are significantly faster !

$ cd ../cmake
$ git checkout master
$ cd ../build
$ cmake ../cmake
$ time make -j
real	0m38.711s
user	1m55.778s
sys	0m21.922s

and

$ cd ../cmake
$ git checkout v3.15.0
$ cd ../build
$ cmake ../cmake
$ time make -j
real	0m31.499s
user	1m36.373s
sys	0m18.004s

ccache also offers some statistics:

$ ccache --stats
cache directory                     /home/user/.cache/ccache
primary config                      /home/user/.config/ccache/ccache.conf
secondary config (readonly)         /etc/ccache.conf
stats updated                       Tue Jun 23 17:34:08 2020
cache hit (direct)                   874
cache hit (preprocessed)               9
cache miss                           882
cache hit rate                     50.03 %
cleanups performed                     0
files in cache                      1754
cache size                          46.5 MB
max cache size                       5.0 GB

Cache size, policies and other configurations are performed by editing ~/.config/ccache/ccache.conf according to the documentation.