代码之家  ›  专栏  ›  技术社区  ›  BPL

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

  •  3
  • BPL  · 技术社区  · 7 年前

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

    • a) 对编译器的多次调用,每次调用一个文件

    • b) 对编译器的调用次数很少,每个调用包含多个文件

    • c) 中等数量的编译器调用,每个调用包含一堆文件

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

    你可以说生成更少的子进程通常会更快、更便宜,但我想知道这些收益是否值得,这样我就可以正确地设计我的工具。

    为了进一步澄清,这里有一个简单的 example ,正如您在该构建中所看到的。ninja文件有许多构建语句,每个编译器调用具有1:1的依赖关系,因此。。。通过将几个源文件分组到单个生成语句中,可以改进生成时间吗?

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Martin Bonner supports Monica    7 年前

    视情况而定。(但是你 知道

    使用MSVC 只需对编译器进行一次调用,即可更快地编译所有文件。这不仅仅是因为Windows上的进程创建速度慢,编译器本身初始化也需要相当长的时间。(当然,从一次二十次到一次全部的速度可能比从一次一次到一次二十次要慢得多。)

    在Linux上使用gcc/clang,一次编译一个文件可能更快。这并不是因为gcc像这样更快,而是因为您可以使用ccache(ccache仅在给定单个文件进行编译时才会优化),ccache进行编译 更快。(显然,如果你的所有文件每次都不一样——因为它们是用独特的内容生成的——那么ccache就帮不上忙了。)这同样适用于Windows上的mingw。