コンパイル高速化比較メモ
開発に参加してる某プログラムパッケージの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で計算結果がおかしい)ため、このまま使えるわけではないが……