コンパイル高速化比較メモ

開発に参加してる某プログラムパッケージのMLで、g++よりclangの方が速いぜ的な話が(Macユーザから)あり、一応Linuxでもソースにパッチを当てればclangでも通るようになった*1ので、コンパイル時間を比較してみた。あと 漢(オトコ)のコンピュータ道: MySQL 5.5をわずか30秒足らずでコンパイルするためのテクニック でccacheのことも知ったので、これも試してみた。

  • g++-4.4 vs. clang
  • with/without ccache

という2つの条件の組合せ。
Quad-coreの2cpuで計8coreなUbuntu Server 10.04.2LTSで実行。RAMは16GBで、十分にある。事前にaclocal/autoreconf/configureまで済ませてある状態。

$ time make -j9

で時間を計る。ccacheを使う場合は、実行前に

$ ccache -C

でキャッシュをクリアしておき、2回連続で試す。つまり、無キャッシュ状態と、完全にキャッシュが効いた状態を比較する。コードを含むヘッダを複数箇所でincludeしているコードが多い場合、無キャッシュでスタートしてもそれなりに効くはず。ccache分のオーバーヘッドの方が大きいかもしれないが。


コンパイラのバージョンは次の通り。実際にはこれにmpicxxをかませる。

$ g++ --version
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ clang++ --version
clang version 3.0 (trunk 129915)
Target: x86_64-unknown-linux-gnu
Thread model: posix
compiler ccache result time(sec.)
g++ no make -j9 931.26s user 80.92s system 434% cpu 3:53.21 total 931.26
g++ cleared make -j9 948.99s user 82.61s system 424% cpu 4:03.13 total 948.99
g++ cached make -j9 98.50s user 53.69s system 272% cpu 55.802 total 98.50
clang no make -j9 798.77s user 69.83s system 437% cpu 3:18.75 total 798.77
clang cleared make -j9 811.85s user 72.17s system 422% cpu 3:29.29 total 811.85
clang cached make -j9 95.60s user 57.89s system 308% cpu 49.716 total 95.60


うん、ccache使えばいいんじゃないかな……w
どうやらコード全体の中では何度もincludeされてその都度コンパイルされている部分というのはccache自体のオーバーヘッドよりも少ない程度のようだ。
しかし一度キャッシュが効いてしまえば圧倒的に速い。確かにclangはg++より速いのだが、そんなのは誤差であった。

*1:動作は若干怪しい(特定のinputで計算結果がおかしい)ため、このまま使えるわけではないが……