首先,让我澄清一下我的问题与Is there any benefit to passing all source files at once to a compiler? 完全无关。 .
我想知道的是,如果我这样做,我的构建时间是否会变得更快:
a) 多次调用编译器,每次调用一个文件
b) 调用编译器的次数很少,每次调用都有很多文件
c) 适度调用编译器,每次调用一堆文件
我为什么要问这个?我正在创建一个忍者生成器(类似于一堆 here,我想知道创建依赖项 DAG 的最佳方法是什么。
您可以声称产生较少的子流程通常会更快且成本更低,但我想知道这些 yield 是否值得,以便我可以正确设计我的工具。
为了进一步澄清,这里有一个简单的 example ,正如您在 build.ninja 文件中看到的那样,有许多构建语句,每个编译器调用具有 1:1 的依赖关系,所以...可以通过将几个源文件分组在单个构建语句上来缩短构建时间吗?
编辑:另外,我猜这 Why is creating a new process more expensive on Windows than Linux?可以为当前主题提供一些见解
最佳答案
这取决于。 (但是您知道这将是“是否更快……”问题的答案,不是吗?)
使用 MSVC,通过一次调用编译器编译所有文件的速度多。不仅在 Windows 上创建进程很慢,编译器也需要相当长的时间来初始化自己。 (当然,从一次 20 个到一次全部的速度提升可能比从一次一个到一次 20 个要小得多。)
在 Linux 上使用 gcc/clang,一次编译一个文件可能会更快。这并不是因为 gcc 像这样更快,而是因为您可以使用 ccache(ccache 只会在给定单个文件进行编译时进行优化),并且 ccache 使编译速度很多。 (显然,如果您的所有文件每次都不同 - 因为它们是用独特的内容生成的 - ccache 将无济于事。)这同样适用于 Windows 上的 mingw。
关于c++ - 在多个编译器调用中包含许多源文件时,构建时是否有任何提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309215/