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

标签 c++ visual-studio build dependency-management ninja

首先,让我澄清一下我的问题与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/

相关文章:

c++ - 为什么 EOF 在我的 scanf while 循环期间不终止?

c - 使用 Stack 构建时如何包含从 haskell 源文件生成的 'xxx_stub.h' 文件

c++ - 当我使用 SDL_RECT 时表面消失

c++ - 从动态创建的数组构造 POD 对象时,是否建议使用 placement new?

c# - (VS2017) 运行选择的代码生成器时出错 : 'Sequence contains no elements'

visual-studio - 在 Visual Studio Code 终端中使用远程服务器?

java - Android Java 构建错误

build - 如何从 Jenkins 的另一份工作中提升特定的内部版本号?

c++ - 快速修复套接字错误 : Connection reset by peer c++

c# - 从 visual studio 中完全删除 "error list"