为什么使用预编译的头会导致构建变慢?

时间:2014-04-10 11:14:09

标签: c++ compile-time

我们的解决方案包含100多个项目,超过8000个cpp文件和超过10个&#39000个头文件。

我试图改善我们的构建时间。

解决方案中的一个项目只包含5个cpp文件,编译大约需要10秒。头文件最初包含在cpp文件中,但是为了准备切换预编译头文件,我将包括移动到一个pch.h文件中。

现在每个cpp文件都包含pch.h文件。

这本身并没有对编译时间做出任何明显的改变 - 它仍然只有10秒钟。

现在,当我告诉项目实际使用pch文件作为预编译头时,编译项目需要17秒。

为什么预编译包含的标题会使项目构建的时间比文件只是每个cpp文件的#included一样?


更多信息。

我们使用一种名为" lumping" - (单个cpp文件不是单独编译的 - 它们每个#included包含在一个项目范围的cpp文件中,这是唯一编译的cpp文件。)

根据"显示包含"以及它的价值,感谢意大利面条代码。 pch文件中的十几个包含文件导致包含大约3000(!)个文件。显然,这需要修复!

编译时预编译的头文件大约为130Mb。

如果我们关闭集总,单个项目构建(不是整个解决方案)需要45秒。如果我们然后打开预编译头,则构建时间会改善。

我可能错过了显而易见的问题,但是为什么当开启lumping时,开启预编译的标头会减慢构建速度吗?

1 个答案:

答案 0 :(得分:1)

PCH做的是"预处理" /"预编译" 多个源文件包含的公共标题上的阶段。这有助于重复"预处理" /"预编译"避免了,编译器为每个源文件加载其先前的状态。

如果您只有一个大的源文件,那么"预处理" /" procompiling"也需要发生,但总共只有一次。因此,保存和加载PCH文件会引入开销,而不会带走(因为没有任何重复)。

我使用术语" preprocess" /" precompile"这里因为PCH的执行方式根据您的编译器而有很大差异,并且可能更倾向于其中一个。

现在,除非你在很多代码中使用像Boost这样繁重的模板库,否则通常足以清理包含依赖项以加快编译时间,这通常是非常重要的因素。但这需要维护。