はじめに
最近になって、Ninjaというビルドシステムがかなり高速らしいという話を耳にしたため、どれくらいビルドが高速になるのかMakeと比較して試してみました。
今回はcmakeのソースに対して、MakeとNinjaそれぞれでビルドを実行して処理時間を計測したいと思います。
また、ビルド時に使用されるMakefile
とbuild.ninja
はそれぞれCMakeLists.txt
から生成したものを使用します。(ややこしいですが、cmakeを使ってcmakeのソースをビルドします。)
環境準備
実行環境について
実行環境はdockerで用意しました。
dockerfileを作成するのが面倒だったので、Ubuntu 22.04のイメージをベースに、必要なパッケージは後からapt install
で追加していきます。
コンテナの作成手順はこの記事では割愛します。
必要なパッケージのインストール
今回のビルドに必要なパッケージをインストールしていきます。
apt install -y gcc make ninja cmake wget build-essential checkinstall zlib1g-dev libssl-dev
cmakeソースの用意
続いて、今回ビルドを試すcmakeのソースをGithubから取得します。
wget https://github.com/Kitware/CMake/releases/download/v3.23.3/cmake-3.23.3.tar.gz
tar -zxvf cmake-3.23.3.tar.gz
cd cmake-3.23.3
ビルド実行
MakeとNinjaそれぞれを使用してビルドを実行します。
また、Makeについては並列実行した場合の速度も測定したいため、-j
オプションを付与したケースでも測定します。
今回設定する並列実行数は、利用できるプロセッサの最大数で設定したいと思います。
利用可能なプロセッサ数は、nproc
コマンドを実行することで確認できます。
今回の環境では最大16個のプロセッサが利用できるため、並列実行数は16で設定してビルドを実施します。
root@ubuntu-work:/# nproc
16
以下のコマンドでそれぞれビルドを実行します。
フルビルドでの計測を想定しているため、実行前にbuild
ディレクトリが作成されていないことを確認してください。
mkdir -p build
cmake -S . -B ./build && cd build && make
mkdir -p build
cmake -S . -B ./build && cd build && make -j16
mkdir -p build
cmake -S . -B ./build -G Ninja && cd build && ninja
実行結果
実行結果は下記の通りになりました。
ビルド方法 | 実行時間 |
---|---|
make | 40m 42s |
make -j16 | 8m 14s |
Ninja | 7m 1s |
他の記事ではNinjaの方が5~10倍ほど速くなったという意見もありましたが、Makeでも並列実行数をうまく設定してやれば、Ninjaのビルド速度との差は割と小さくなりました。
とはいえ、Ninjaの方が1分ほどビルド時間は短縮できているので、高速であることは間違いないと思います。
差分ビルドも試してみる
とりあえずフルビルドでの実行時間を計測してみましたが、差分ビルドでの性能も気になるので測定してみました。
フルビルド実行後に、一部のソースファイルに簡単な追記を加えたうえで再度ビルドを実行しました。
(Makeの並列実行無しの場合は時間かかりそうだったので、サボって並列実行オプション付与の場合のみ測定しましたが悪しからず。)
ビルド方法 | 実行時間 |
---|---|
make -j16 | 2m 3s |
Ninja | 1m 39s |
差分ビルドでもNinjaの方が20秒ほど短縮できているため、この結果からもNinjaの速さが見て取れます。
おわりに
前評判を色々見てからNinjaのビルドを実行してみましたが、思ってたよりもビルドが速くなるというわけでは無かったなというのが正直な感想です。
今回は、ビルドを試したプロジェクトも1つのみですし、実行環境についてもコンテナ環境でしか検証してないので、もっと大きなプロジェクトだったりもっとプロセッサ数が多い実行環境だったりすると、結果も色々変わってくるかもしれません。
ただ、cmakeが利用できる環境であれば、MakeからNinjaへの切り替えは簡単なうえ、生成されるbuild.ninja
ファイルもMakefile
よりも読みやすくなるよう考慮されているようなので、MakeからNinjaへ乗り換えるのはかなりアリだと思います。