SConsで並列ビルド

今更ながらSConsでもMakeと同じく「-j 」オプションで並列ビルドができること知った。なので、さっそく自分のプロダクト(dtl)で試してみた。CPUのスペックやビルド対象は以下の通り。

  • CPU
  • ビルド対象
    • dtlのテストプログラム

「-j」オプション未使用

$ time scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o Intdifftest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Intdifftest.cpp
g++ -o Patchtest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Patchtest.cpp
g++ -o Strdiff3test.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Strdiff3test.cpp
g++ -o Strdifftest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Strdifftest.cpp
g++ -o dtl_test.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp dtl_test.cpp
g++ -o dtl_test_common.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp dtl_test_common.cpp
g++ -o dtl_test Intdifftest.o Patchtest.o Strdiff3test.o Strdifftest.o dtl_test.o dtl_test_common.o -lgtest -lpthread
scons: done building targets.
scons  10.17s user 0.46s system 98% cpu 10.754 total
$

dtlはヘッダファイルのみで構成されている上にテンプレートをふんだんに使用しているので、規模の割には時間がかかる*1。このマシンだと10秒そこそこだが、僕のMacBookだと25〜30秒かかる。

「-j 4」でビルド

$ time scons -j 4
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o Intdifftest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Intdifftest.cpp
g++ -o Patchtest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Patchtest.cpp
g++ -o Strdiff3test.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Strdiff3test.cpp
g++ -o Strdifftest.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp Strdifftest.cpp
g++ -o dtl_test.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp dtl_test.cpp
g++ -o dtl_test_common.o -c -Wall -O2 -I/home/bokko/workspace/dtl/dtl-cpp dtl_test_common.cpp
g++ -o dtl_test Intdifftest.o Patchtest.o Strdiff3test.o Strdifftest.o dtl_test.o dtl_test_common.o -lgtest -lpthread
scons: done building targets.
scons -j 4  16.26s user 0.61s system 323% cpu 5.209 total
$

というわけで普段の半分の時間でビルドできるようになった。

*1:さらにgtestもテンプレートバリバリ使ってるのでこれにリンクするだけで結構ビルドが遅くなる