開発に最適なコンパイルオプションの模索

今作っている,DHTライブラリlibcageのソースコードが増大してきて,コンパイルに時間がかかるようになってきたので,どのくらいの時間がかかるの計測してみた.libcageのソースはGitHubにアップしてあるが,今回計測したのは現在鋭意開発中のrdpブランチ(http://github.com/ytakano/libcage/tree/rdp)となる.

まずは,行数をみてみる.

$ cd libcage
$ wc src/*.cpp src/*.hpp sample/*.cpp test/*.cpp
15338   38717  521467 total

サンプルやテストコードも含めると,およそ1万5000行ぐらい.C++言語でかかれており,Boostを多用している.

まずは,コンパイルオプションを-O0として,最適化無しにしてコンパイルしてみる.コンパイル環境はMac OS X 10.6.3 Snow Leopardで,CPUは2GHz Intel Core Duo, メモリは2GB 667MHz DDR2 SDRAM,HDDは2.5inch 5400rpm,gccのバージョンは4.2.1という感じ.

$ time omake
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.01 sec)
*** omake: done (2 min 32.41 sec, 2/21 scans, 30/30 rules, 30/330 digests)     
omake  127.62s user 13.86s system 92% cpu 2:32.43 total

2分32秒43をマーク.

次に,最適化オプションを-O3としてコンパイル

$ time omake
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.02 sec)
*** omake: done (3 min 26.15 sec, 21/21 scans, 30/30 rules, 30/330 digests)    
omake  179.63s user 15.98s system 94% cpu 3:26.17 total

3分26秒17をマーク.

次に,omakeの並列コンパイルオプションを-j2としてコンパイル.なぜ2かというと,Core Duoのコアが2つだから.なお,最適化オプションは先ほどと同じ-O3となっている.

$ time omake -j2
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.01 sec)
*** omake: done (2 min 03.92 sec, 0/21 scans, 30/30 rules, 30/329 digests)     
omake -j2  184.68s user 16.04s system 161% cpu 2:03.94 total

2分03秒94をマーク.合計のCPU消費時間は増えているけれど,実時間では1.67倍ほど早くなった.その代わり,コンパイル中はCPUリソースの殆どをコンパイラにもって行かれるので,コンパイル専用のマシンじゃない場合は,他の作業を行うのがままならなくなることがある.

ちなみに,-j4としてみたら一向にコンパイルが終わらなかったので途中で計測を中断した.並列コンパイルの数はCPUの合計コア数より多くすると,逆に遅くなるのかも知れない.

というわけで,開発中は最適化オプション無しで-O0として,並列コンパイル数はCPUの合計コア数-1ぐらいが無難というのが結論.プログラムが完成して,パフォーマンス計測する段階となったら,最適化オプションを-O3にしてコンパイルした方が良い.最適化ありと無しでは,CPU利用率がかなり違ってくる.