簡単な比較

この実験では、次のような内容のCファイルを1,000生成しました。

#include<stdio.h>
#include"header.h"

int func23() { return 0; }

各ファイルの関数番号は異なります。さらに、各関数を順番に呼び出すメインCファイルもあります。その後、これらのファイルを単一のExecutableファイルにコンパイルするMesonCMakeSConsPremakeAutotoolsのビルドシステムファイルを生成しました。

これにより3つの異なるものを測定しました。1つ目はコンフィギュレーション時間です。つまり、ビルドシステムが必要なビルドファイルを生成するのにかかる時間です。これは通常、configure stepと呼ばれます。時間は秒単位で測定されます。

測定する2つ目のものはビルド時間です。これはコンパイラによって制限されるべきであり、最適な場合はすべてのビルドシステムで同じになります。このテストでは4つの並列プロセスが使用されました。

測定した3つ目のものは空のビルド時間です。これは、ビルドシステムがすべてのソースファイルのステータスをチェックするのにかかる時間を測定します。これは、ソースファイルのいずれかが再ビルドを引き起こす可能性があるからです。

CMakeにはMakeとNinjaという2つの異なるバックエンドがあるため、両方のバックエンドでテストを実行しました。すべてのテストはUbuntu 13/04を実行する2011年頃のMacBook Proで実行されました。テストは複数回実行され、最も速い時間を常に記録しました。

コンフィギュレーション時間の結果は次のとおりです。

Configuration times

このテストでSConsが0秒になった理由は、configureステップとbuildステップを分離できないからです。これらは1つのユニットとして実行されます。Autotoolsはこのテストで明確な敗者であり、2番目に遅いものより桁違いに遅いです。このコンフィギュレーション時間には、autogenとconfigureの両方が含まれます。他のすべてのシステムはこのセットアップに1秒未満かかり、人間が瞬時と解釈するのに十分な速さです。

Build times

ビルド時間は少し均等です。SConsは最も遅く、2番目に遅いものより約10秒遅いです。その一部はconfigureステップからの作業ですが、それでもパフォーマンスは最悪です。Premakeは、Autotoolsを僅差で上回る最速のMakeベースビルドシステムです。Ninjaベースの両方のビルドシステムは、非Ninjaベースのすべてのシステムより高速であり、Mesonの方がわずかに高速です。実際、違いは最小限です。CMakeがMakeまたはNinjaを使用する場合の時間と比較すると、Ninjaの利点がわかります。バックエンドを変更するだけで、合計ビルド時間の3.5秒(20%以上)を節約できます。プロジェクトのCMakeコンフィギュレーションファイルを編集する必要はありません。

No-op time

空のビルド時間は、通常のビルド時間の性能を反映しています。SConsは再び最も遅く、メソンが0.03秒しかかからないのに対し、3秒以上かかります。これは桁違いの差です。最速のMakeベースシステムであるAutotoolsでさえ、桁違いに遅いです。Ninjaは、前のテストと同様にトップの座を守っています。

結論

ビルドシステムのパフォーマンスは重要です。この非常に単純な例でも、さまざまな一般的なビルドシステムでの違いを見付けることができます。プロジェクトのサイズが増加するにつれて、これらの違いはさらに大きくなります。(作者は Clang コンパイラのコンパイル時に、Make の非操作ビルド時間が 30 秒、Ninja では 1 秒未満であることを目撃しました。)増分ビルド時間を短く保つことはプログラマーの生産性の重要な鍵の 1 つであり、開発者はより迅速にイテレーションして創造的なゾーンにとどまることができます。

元のスクリプト

自分でこれらの実験を実行したい人は、ここからスクリプトをダウンロードできます

検索の結果は次のとおりです。