LoginSignup
11
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-13

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 と書いておくと幸せになれます。

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7