ccacheでC/C++のコンパイルを高速化する

  • 6
    いいね
  • 0
    コメント

Go言語でsqlite3を扱うときにお世話になる go-sqlite3 ですがドライバ部分がC言語で書かれています。
Linuxでは特に支障はないのですがMacでコンパイルすると何故か時間がかかってしまうので、なんとかコンパイルを高速化できないかと調べたメモです。

ccache とは

ccache は C/C++ のコンパイル時のデータをキャッシュして2回目以降のコンパイルを高速化するツールです。

導入

各種パッケージマネージャーで簡単にインストールできます

Macの場合

$ brew install ccache

Debian系の場合

$ sudo apt install ccache

基本的な使い方

いつも使っているコンパイラの前にccacheコマンドを入れるだけ

gccで使う

$ ccache gcc sample.c

clangで使う

$ ccache clang sample.c

g++で使う

$ ccache g++ sample.cpp

clang++で使う

$ ccache clang++ sample.cpp

Go言語のコンパイルにも使ってみる

go build で用いるC/C++コンパイラは環境変数$CC$CXXで指定できます。
これを利用してGo言語のライブラリなどで使用しているC/C++のコンパイルに ccache を使ってみます。

呼び出し用ファイルを作る

CC='ccache gcc'のように指定できればいいのですが、このままだとエラーが出るので呼び出し用のファイルを作ります。

$ sudo echo '#!/bin/bash
exec ccache gcc $@' > /usr/local/bin/ccache-gcc
$ sudo chmod +x /usr/local/bin/ccache-gcc

コンパイルしてみる

$ CC=ccache-gcc go build sample.go

検証

go-sqlite3 を import するだけのサンプルです

package main

import (
    "fmt"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    fmt.Println("hello, world.")
}

キャッシュされてコンパイルが高速化するのは2回目以降なので2回目の結果を載せています。

gcc でコンパイル (ccache なし)

$ CC=gcc time go build sample.go

real    0m42.89s
user    0m39.95s
sys     0m2.14s

clang でコンパイル (ccache なし)

$ CC=clang time go build sample.go

real    0m36.53s
user    0m32.93s
sys     0m1.75s

ccache 付き gcc でコンパイル

$ CC=ccache-gcc time go build sample.go

real    0m4.143s
user    0m2.942s
sys     0m1.194s

ccache 付き clang でコンパイル

$ CC=ccache-clang time go build sample.go

real    0m3.80s
user    0m2.10s
sys     0m1.24s

まとめ

ccache を導入して bashrc に export CC=ccache-gcc と書いておくと幸せになれます。

この投稿は 信州大学 kstm Advent Calendar 201614日目の記事です。