Makefile 忍者语言中有什么东西比make更快吗?

Makefile 忍者语言中有什么东西比make更快吗?,makefile,build,ninja,Makefile,Build,Ninja,我经常看到有人说Ninja比Make更快,更擅长支持增量构建,更擅长并行化。这是一个实现质量问题,还是忍者语言中有什么东西支持这一点 我知道Ninja和Make使用不同的文件格式来描述任务的依赖关系图。我知道Make允许使用比忍者更高级的功能,比如globs。如果使用了这样的高级功能,Make将执行比忍者更复杂的任务,我们不能期望Make更快。这是一个不公平的比较 但是,假设未使用此类高级功能。没有全局化,没有模式规则,只有基本的“out\u file:in\u file1,in\u file2

我经常看到有人说Ninja比Make更快,更擅长支持增量构建,更擅长并行化。这是一个实现质量问题,还是忍者语言中有什么东西支持这一点

我知道Ninja和Make使用不同的文件格式来描述任务的依赖关系图。我知道Make允许使用比忍者更高级的功能,比如globs。如果使用了这样的高级功能,Make将执行比忍者更复杂的任务,我们不能期望Make更快。这是一个不公平的比较

但是,假设未使用此类高级功能。没有全局化,没有模式规则,只有基本的“out\u file:in\u file1,in\u file2\n\t要构建的命令”一遍又一遍地重复。不使用这样的高级功能,使得Make和忍者在执行任务方面的竞争更加激烈

我的理解是,如果我们以这种方式限制makefile,那么忍者文件和makefile可以很容易地相互转换。这是正确的吗


在有限的makefile上执行Make比Ninja慢有什么内在原因吗?或者这仅仅是因为标准Make实现没有针对以这种方式构造的makefile进行优化吗?

简而言之,Ninja解析速度更快,并且具有减少解析量的内置功能

从:

在其他构建系统都是高级语言的地方,Ninja的目标是成为一个汇编程序

Ninja文件通常是从其他makefiles“编译”而来的,这使得它是一个两步的过程,而Make只是一步。这两个步骤可能比普通制造要慢。因为在大多数情况下,只有第二步是必要的,所以最终的效果是速度更快。这有点类似于比较编译程序和解释程序


。在makefile中实现这些功能会导致更长、更复杂的makefile,从而导致更多的解析。

需要注意的是,GNU make自4.0版(2013年)起就提供了缓冲输出,当然,从永远开始就可以使用并行。默认情况下,这些选项不启用,但它们是命令行选项(默认情况下可以通过环境变量启用),因此不需要花费任何生成时间。而且,从GNU make 4.3开始,显式规则上具有多个输出的边(具有多个输出的隐式规则一直受到支持)具有内置支持。但是,我并不反对《忍者手册》那一节中的一般观点。您可以使用分组输出语法在GNU make中获得多个输出:“foo.a foo.so&:foo.cpp bar.cpp”。请参阅以了解详细信息。从您和@MadScientist所写的内容中,我推断,如果使用足够新的版本进行分组输出,那么ninja语言确实相当于GNU make的一个子集。对吗?我对忍者的一切都不太熟悉。我相信Ninja提供了某种类型的内置依赖项生成(例如,自动计算出哪些源文件包含哪些头文件),而GNU make没有内置依赖项生成(如果您有像GCC或clang这样的现代编译器,这可以便宜地完成,但您必须自己完成)。此外,如果命令行发生了更改,Ninja会自动重建,而GNU make没有这样做。忍者维护着一个关于上次建造的信息数据库;GNU make不保留任何以前版本的状态。Ninja依赖项支持包括调用
gcc-M
,就像make一样,然后将gcc的输出(一个make规则)转换为Ninja规则。否则,它解决了一个问题,如果你没有使用忍者的话,你在一开始就不会遇到这个问题。