简单比较
在这个实验中,我们生成了 1000 个 C 文件,它们的内容如下。
#include<stdio.h>
#include"header.h"
int func23() { return 0; }
每个文件中的函数编号都不同。此外,还有一个主 C 文件,它依次调用每个函数。然后,我们为Meson、CMake、SCons、Premake 和Autotools生成了构建系统文件,将这些文件编译成一个可执行文件。
通过这种方式,我们测量了三个不同的方面。首先是配置时间,即构建系统生成必要的构建文件所花费的时间。这通常被称为配置步骤。时间以秒为单位测量。
第二件事是要测量构建时间。这应该受到编译器的限制,在最佳情况下,对于每个构建系统都应该相同。在此测试中使用了四个并行进程。
第三件事是我们测量的空构建时间。这衡量构建系统检查所有源文件状态所花费的时间,因为它们中的任何一个都可能导致重新构建。
由于 CMake 有两个不同的后端,Make 和 Ninja,因此我们在两者上都运行了测试。所有测试都在运行 Ubuntu 13/04 的 2011 年 MacBook Pro 上运行。测试运行了多次,我们总是取最短的时间。
以下是配置时间的测试结果。
SCons 在此测试中获得零秒的原因是,您无法将配置步骤和构建步骤分开。它们作为一个单元运行。Autotools 是此测试的明显失败者,因为它比第二慢的构建系统慢了一个数量级。此配置时间包括 autogen 和 configure。所有其他系统在不到一秒的时间内完成此设置,对于人类来说,这快到足以被认为是瞬时的。
构建时间比较均衡。SCons 最慢,比第二慢的系统慢了近 10 秒。其中一部分是配置步骤的工作,但它仍然具有最差的性能。Premake 是最快的基于 Make 的构建系统,略微超过 Autotools。所有基于 Ninja 的构建系统都比所有非 Ninja 系统快,其中 Meson 稍微快一些。在实践中,差异很小。通过比较 CMake 使用 Make 或 Ninja 时的计时,可以看出 Ninja 的优势。仅通过更改后端,就可以将总构建时间缩短 3.5 秒(超过 20%)。项目的 CMake 配置文件不需要任何更改。
空构建时间反映了常规构建时间的性能。SCons 再次是最慢的,花费了超过 3 秒,而 Meson 仅花费了 0.03 秒,相差两个数量级。即使是最快的基于 Make 的系统 Autotools,也比 Meson 慢了一个数量级。Ninja 就像在之前的测试中一样,占据了前两位。
结论
构建系统性能很重要。即使在这个极其简单的示例中,我们也可以发现各种流行构建系统之间的差异。随着项目规模的扩大,这些差异会变得更大。(作者亲眼目睹了 Make 的无操作构建时间为 30 秒,而 Ninja 在编译 Clang 编译器时不到一秒。)保持增量构建时间的低水平是程序员生产力的主要关键之一,因为它允许开发人员更快地迭代并保持在创造性区域。
原始脚本
那些想要自己运行这些实验的人可以在这里下载脚本
搜索结果是