在多个编译器调用中包含许多源文件时,构建时是否有任何提升?

Is there any build-time boost when including many source files on multiple compiler calls?

首先,让我澄清一下我的问题与 Is there any benefit to passing all source files at once to a compiler? 完全无关。

我想知道的是,如果我这样做,我的构建时间是否会变得更快:

我为什么要问这个?我正在创建忍者生成器(类似于一堆 here,我想知道创建依赖项 DAG 的最佳方法是什么。

您可以声称产生较少的子流程通常会更快且成本更低,但我想知道这些收益是否值得,以便我可以正确设计我的工具。

只是为了进一步澄清,这里有一个简单的 example,正如您在那个 build.ninja 文件中看到的那样,每个编译器调用都有许多具有 1:1 依赖项的构建语句,所以...可以通过在单个构建语句上对几个源文件进行分组来缩短构建时间吗?

编辑:另外,我想这个 Why is creating a new process more expensive on Windows than Linux? 可以为当前主题提供一些见解

视情况而定。 (但是你 知道 这将是 "is it faster to ..." 问题的答案,不是吗?)

使用 MSVC,只需调用一次编译器即可 更快地编译所有文件。不仅仅是 Windows 上的进程创建速度很慢,编译器也需要相当长的时间来初始化自己。 (当然,从一次 20 个到一次全部的速度提升可能比从一次一个到一次 20 个要小得多。)

在Linux上使用gcc/clang,一次编译一个文件可能会更快。这并不是因为 gcc 像这样更快,而是因为您可以使用 ccache(ccache 只会在给定单个文件进行编译时进行优化),并且 ccache 使编译速度 much 更快。 (显然,如果您的所有文件每次都不同 - 因为它们是用独特的内容生成的 - ccache 将无济于事。)这同样适用于 Windows.

上的 mingw