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