Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用预编译头会导致生成速度变慢?_C++_Compile Time - Fatal编程技术网

C++ 为什么使用预编译头会导致生成速度变慢?

C++ 为什么使用预编译头会导致生成速度变慢?,c++,compile-time,C++,Compile Time,我们的解决方案包含100多个项目、8000多个cpp文件和10000多个头文件 我正在努力提高我们的构建时间 解决方案中的一个项目只包含5个cpp文件,编译大约需要10秒。头文件最初包含在cpp文件中,但为了准备打开预编译的头文件,我将包含文件移动到单个pch.h文件中 每个cpp文件现在都包括pch.h文件 这本身并没有对编译时间做出任何明显的改变——仍然是10秒左右 现在,当我告诉项目实际使用pch文件作为预编译头时,编译项目需要17秒 为什么预编译包含的标题会使项目的构建时间比每个cpp文

我们的解决方案包含100多个项目、8000多个cpp文件和10000多个头文件

我正在努力提高我们的构建时间

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

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

这本身并没有对编译时间做出任何明显的改变——仍然是10秒左右

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

为什么预编译包含的标题会使项目的构建时间比每个cpp文件只包含文件的时间长


更多信息

我们使用了一种称为“集总”的技术(单个cpp文件不是单独编译的——它们都包含在单个项目范围的cpp文件中,这是唯一编译的cpp文件)

值得一提的是,多亏了意大利面代码,根据“Show Includes”的说法,pch文件中包含的十几个左右的文件导致大约3000(!)个文件被包含。显然,这需要修复

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

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

我可能忽略了一个显而易见的问题,但为什么在打开集总时,打开预编译头会降低构建速度?

PCH所做的是对多个源文件包含的公共头执行“预处理”/“预编译”阶段。这有助于避免重复的“预处理”/“预编译”,并且编译器为每个源文件加载其以前的状态

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

我在这里使用术语“preprocess”/“precompile”,因为PCH的实现方式因编译器而异,可能更倾向于其中之一


现在,除非您在大部分代码中使用像Boost这样的重型模板库,否则清理include依赖项通常足以加快编译速度,这通常是一个非常重要的因素。但这需要维护。

“集总”听起来像是一个灾难的处方:|冒昧地猜测,为每个单元加载单片PCH的时间似乎比编译一个只包含几个头的单元所需的时间更长。您使用的编译器是什么?从您信息的第二部分,我知道问题实际上不是由预编译头引起的,而是由集总引起的,不是吗?另外,45秒来构建100个项目对我来说似乎是合理的。@Sh3ljohn-这是VS2010。另外,我编辑了这个问题——45秒用于1个项目——整个解决方案需要5分钟来编译:-(