Mejorar la velocidad de compilación con CCACHE

ccache console

Actualmente estamos acostumbrados a lenguajes de programación de script como python, php, javascript donde el proceso de compilación no existe o al menos es transparente para el desarrollador, u otros lenguajes como java o la arquitectura .NET donde el código compilado es un lenguaje intermedio y no un fichero puramente binario como tal.

Lenguajes como C++ siguen vivos, en pleno desarrollo y siguen teniendo su nicho de mercado con famosos entornos de desarrollo multiplataforma como QT o wxWidgets. En estos lenguajes el desarrollador realiza una compilación real y el resultado son ejecutables binarios.

Quién no ha sufrido largos ciclos de compilación en proyectos grandes especialmente cuando hay que realizar compilaciones completas del código o cuando un software en las que no se han tenido en cuenta una buena organización de cabeceras y dependencias, se modifica un de esas cabeceras, y se crea una compiación casi completa sin esperarlo?

En este artículo os presento CCACHE (4.3 al escribir este artículo), una herramienta necesaria que nos permitirá reducir los tiempos de compilación entre 2 y 3 veces (dependiendo de la tasa de éxito de la caché). CCACHE actúa como intermediario en la compilación, escanéa el código fuente para detectar si han habido cambios reales utilizando técnicas como la comparación de fechas de modificación y hashes del código. Los binarios se almacenan en la caché comprimidos mediante un algoritmo de compresión altamente optimizado para ahorrar espacio en disco.

Descargar CCACHE

Descargar CCACHE 4.3

Compilar CCACHE

Información extraída de la página oficial, pero en nuestro caso vamos a omitir "make install" ya que lo instalaremos manualmente


tar -xzvf ccache-4.3.tar.gz
cd ccache-4.3
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Si todo ha ido bien, ahora tendremos el ejecutable "ccache" en nuestro directorio de compilación.

Instalación

Para que nuestro sistema lo tenga en cuenta añadiremos "ccache" delante de nuestro path. Esta línea se puede añadir a ".bashrc" para hacerlo persistente.


export PATH="path/to/ccache/build:$PATH"

Usando CCACHE

Ccache es compatible con los compiladores GCC y Clang, se puede usar en Windows, Linux y MAC, y aunque no soporta todos los flags de compilación, si es utilizable en la mayoría de los casos.

Tras hacer ccache disponible en nuestro path lo usaremos de la siguiente manera:


# gcc
ccache gcc foo.c -o foo.o
# g++
ccache g++ foo.cpp -o foo.o
# clang
ccache clang foo.c -o foo.o
# clang++
ccache clang++ foo.cpp -o foo.o

Tambíen podemos utilizar ccache a través de CMake modificando el compilador a usar, de la misma manera que hemos hecho anteriormente. La mejor manera de pasar el compilador a CMake es a través de las variables de entorno "CC"  para el compilador de C y "CXX" para el compilador C++ respectivamente, antes de llamar a cmake:


export CC=ccache gcc
export CXX=ccache g++
cmake /path/to/your/project

Comandos Útiles

Estos comandos nos ayudarán a configurar y conocer el estado de ccache en cualquier momento:

Opción -s:

Nos ayuda a ver las estadísticas actuales de la caché (aciertos / fallos), tamaño, directorios donde reside la caché y configuración.


$ccache -s

cache directory                     /home/myuser/.cache/ccache
primary config                      /home/myuser/.config/ccache/ccache.conf
secondary config (readonly)         /usr/local/etc/ccache.conf
stats updated                       Wed Jun 23 13:29:41 2021
cache hit (direct)                    26
cache hit (preprocessed)             496
cache miss                           494
cache hit rate                     51.38 %
called for link                       65
no input file                          1
cleanups performed                    16
files in cache                       260
cache size                         206.0 MB
max cache size                       5.0 GB

Opción -x:

Información sobre el ratio de compresión de la caché.


$ccache -x

Scanning... 100.0% [===========================================================]

Total data:            205.5 MB (206.0 MB disk blocks)
Compressed data:       205.5 MB (12.6% of original size)
  - Original data:       1.6 GB
  - Compression ratio: 7.919 x  (87.4% space savings)
Incompressible data:     0.0 kB


Opción -C (Mayúscula):

Aunque no es necesario limpiar la caché, ya que CCACHE se recicla al llegar a los valores de configuración "max cache size" y nunca ocupará  más de este tamaño, con esta opción tenemos la posibilidad de vaciar la caché.

Modificar valores de configuración

Ccache viene con unos valores por defecto, pero podemos sobreescribirlos a través de su fichero de configuración "ccache.cof" que se debe ubicar en el lugar indicado por el comando "ccache -s". En nuestro caso "/home/myuser/.config/ccache/ccache.conf" y si el fichero no existe habrá que crearlo en dicha ubicación.

Ccache.conf en un fichero de texto plano con el formato clave=valor.

Si tenemos mucho disco duro y la tasa de fallos de cache es alta, podemos aumentar el tamaño de la caché añadiendo las siguientes líneas al fichero de configuración:


# Set maximum cache size to 10 GB:
max_size = 10G

Para testear que los cambios se han aplicado, basta con ejecutar "ccache -s" de nuevo y ver como el valor ha aumentado de 5 a 10 GB.

Podéis obtener una lista de todos los comandos y opciones en su Documentación Oficial

Etiquetas