2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Ninjaが爆速でビルド出来るらしいのでMakeと比較してみた

Posted at

はじめに

最近になって、Ninjaというビルドシステムがかなり高速らしいという話を耳にしたため、どれくらいビルドが高速になるのかMakeと比較して試してみました。

今回はcmakeのソースに対して、MakeとNinjaそれぞれでビルドを実行して処理時間を計測したいと思います。

また、ビルド時に使用されるMakefilebuild.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から取得します。

cmakeソースの取得
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ディレクトリが作成されていないことを確認してください。

Makeの場合
mkdir -p build
cmake -S . -B ./build && cd build && make
Make(-jオプション付与)の場合
mkdir -p build
cmake -S . -B ./build && cd build && make -j16
Ninjaの場合
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へ乗り換えるのはかなりアリだと思います。

参考

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?