visual studio 生成预编译头节省编译时间

预编译头(precompiled header)是程序设计时把头文件编译为中间格式(如目标文件),以节约在开发过程中编译器反复编译该头文件的开销。 C语言、C++语言、Objective C语言等都有类似的技术。
有的头文件包含了巨量的源代码(如著名的windows.h),或者使用模板编程时要生成巨大的头文件模板库(如Eigen math library与Boost C++ libraries)。为减少编译时间,某些编译器允许把头文件编译为某种中间形式称为预编译头(precompiled header),后续再编译源文件时就可以尽量直接使用这些预编译头。
以下演示在visual studio 中启用生成预编译头,节省编译时间。

  • 打开编译时间计时

  【工具】【选项】然后如下设置

  

  • 创建测试头文件

  创建stdafx.h文件引用常用的头文件,stdafx是standard application framework extension的缩写。

1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <chrono>
#include <unordered_map>
#include <map>
#include <algorithm>
#include <memory>
#include <random>
#include <thread>
#include <list>
#include <tuple>

  创建stdafx.cpp文件引入stdafx.h的头文件

1
#include "stdafx.h"

  创建main函数的cpp文件,试用stdafx.h

1
2
3
4
5
6
#include "stdafx.h"
 
int main()
{
    std::cout << "Hello World\n";
}

如下所示:

  • 测试编译时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
已启动生成…
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>stdafx.cpp
1>ConsoleApplication1.cpp
1>
1>项目性能摘要:
1>     1775 毫秒 C:\Users\xunwu\source\repos\ConsoleApplication1\ConsoleApplication1.vcxproj   1 次调用
1>
1>目标性能摘要:
1>        0 毫秒 _SplitProjectReferencesByFileExistence     1 次调用
1>        0 毫秒 AfterResolveReferences                     1 次调用
1>        0 毫秒 ResolveAssemblyReferences                  1 次调用
1>        0 毫秒 ExpandSDKReferences                        1 次调用
1>        0 毫秒 ResolveSDKReferences                       1 次调用
1>        0 毫秒 ResolveProjectReferences                   1 次调用
1>        0 毫秒 PrepareProjectReferences                   1 次调用
1>        0 毫秒 SelectClCompile                            1 次调用
1>        0 毫秒 GetReferencedVCProjectsInfo                1 次调用
1>        0 毫秒 BeforeResolveReferences                    1 次调用
1>        0 毫秒 ResolveReferences                          1 次调用
1>        0 毫秒 ComputeCLInputPDBName                      1 次调用
1>        0 毫秒 _SelectedFiles                             1 次调用
1>        0 毫秒 ComputeReferenceCLInput                    1 次调用
1>        0 毫秒 SelectCustomBuild                          1 次调用
1>        0 毫秒 SetCABuildNativeEnvironmentVariables       1 次调用
1>        0 毫秒 GetFrameworkPaths                          1 次调用
1>        0 毫秒 _CheckWindowsSDKInstalled                  1 次调用
1>        0 毫秒 GetResolvedWinMD                           1 次调用
1>        0 毫秒 _PrepareForReferenceResolution             1 次调用
1>        0 毫秒 ComputeMIDLGeneratedCompileInputs          1 次调用
1>        0 毫秒 FindReferenceAssembliesForReferences       1 次调用
1>        1 毫秒 GetReferenceAssemblyPaths                  1 次调用
1>        1 毫秒 _GetProjectReferenceTargetFrameworkProperties   1 次调用
1>        1 毫秒 FixupCLCompileOptions                      1 次调用
1>        1 毫秒 SetBuildDefaultEnvironmentVariables        1 次调用
1>        1 毫秒 AssignProjectConfiguration                 1 次调用
1>        1 毫秒 WarnCompileDuplicatedFilename              1 次调用
1>        2 毫秒 InitializeBuildStatus                      1 次调用
1>        2 毫秒 _CheckForInvalidConfigurationAndPlatform   1 次调用
1>        7 毫秒 PrepareForBuild                            1 次调用
1>     1754 毫秒 ClCompile                                  1 次调用
1>
1>任务性能摘要:
1>        0 毫秒 SetEnv                                     5 次调用
1>        0 毫秒 MakeDir                                    2 次调用
1>        0 毫秒 WriteLinesToFile                           1 次调用
1>        0 毫秒 Touch                                      1 次调用
1>        0 毫秒 AssignProjectConfiguration                 1 次调用
1>        0 毫秒 MSBuild                                    1 次调用
1>        1 毫秒 ReadLinesFromFile                          1 次调用
1>        1 毫秒 Delete                                     2 次调用
1>        1 毫秒 Message                                    2 次调用
1>        1 毫秒 CheckVCToolsetVersion                      1 次调用
1>     1752 毫秒 CL                                         2 次调用
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

  

  耗时1775ms

  • 启用预编译头

  右击stdafx.cpp文件【属性】【预编译头】【预编译头】选择创建,注意是创建,不是使用

 

点击确定,应用,然后关闭

启用项目的预编译头,右击项目【属性】此处设置,预编译头为使用。

 

 

 

  • 测试编译时间

首次编译会生成预编译头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
已启动生成…
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>stdafx.cpp
1>ConsoleApplication1.cpp
1>
1>项目性能摘要:
1>     1732 毫秒 C:\Users\xunwu\source\repos\ConsoleApplication1\ConsoleApplication1.vcxproj   1 次调用
1>
1>目标性能摘要:
1>        0 毫秒 _SplitProjectReferencesByFileExistence     1 次调用
1>        0 毫秒 ResolveAssemblyReferences                  1 次调用
1>        0 毫秒 ExpandSDKReferences                        1 次调用
1>        0 毫秒 ResolveSDKReferences                       1 次调用
1>        0 毫秒 FindReferenceAssembliesForReferences       1 次调用
1>        0 毫秒 PrepareProjectReferences                   1 次调用
1>        0 毫秒 GetReferencedVCProjectsInfo                1 次调用
1>        0 毫秒 SelectClCompile                            1 次调用
1>        0 毫秒 AssignProjectConfiguration                 1 次调用
1>        0 毫秒 BeforeResolveReferences                    1 次调用
1>        0 毫秒 ComputeCLInputPDBName                      1 次调用
1>        0 毫秒 ComputeMIDLGeneratedCompileInputs          1 次调用
1>        0 毫秒 _SelectedFiles                             1 次调用
1>        0 毫秒 ComputeReferenceCLInput                    1 次调用
1>        0 毫秒 WarnCompileDuplicatedFilename              1 次调用
1>        0 毫秒 SelectCustomBuild                          1 次调用
1>        0 毫秒 SetCABuildNativeEnvironmentVariables       1 次调用
1>        0 毫秒 GetReferenceAssemblyPaths                  1 次调用
1>        0 毫秒 GetFrameworkPaths                          1 次调用
1>        0 毫秒 _CheckWindowsSDKInstalled                  1 次调用
1>        0 毫秒 GetResolvedWinMD                           1 次调用
1>        0 毫秒 _PrepareForReferenceResolution             1 次调用
1>        0 毫秒 AfterResolveReferences                     1 次调用
1>        0 毫秒 ResolveReferences                          1 次调用
1>        1 毫秒 SetBuildDefaultEnvironmentVariables        1 次调用
1>        1 毫秒 _GetProjectReferenceTargetFrameworkProperties   1 次调用
1>        1 毫秒 ResolveProjectReferences                   1 次调用
1>        1 毫秒 _CheckForInvalidConfigurationAndPlatform   1 次调用
1>        2 毫秒 InitializeBuildStatus                      1 次调用
1>        2 毫秒 FixupCLCompileOptions                      1 次调用
1>       15 毫秒 PrepareForBuild                            1 次调用
1>     1705 毫秒 ClCompile                                  1 次调用
1>
1>任务性能摘要:
1>        0 毫秒 Message                                    2 次调用
1>        0 毫秒 MakeDir                                    2 次调用
1>        0 毫秒 CheckVCToolsetVersion                      1 次调用
1>        0 毫秒 ReadLinesFromFile                          1 次调用
1>        0 毫秒 AssignProjectConfiguration                 1 次调用
1>        0 毫秒 MSBuild                                    1 次调用
1>        0 毫秒 Delete                                     2 次调用
1>        1 毫秒 SetEnv                                     5 次调用
1>        1 毫秒 Touch                                      1 次调用
1>        1 毫秒 WriteLinesToFile                           1 次调用
1>     1704 毫秒 CL                                         2 次调用
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

  第二次编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
已启动生成…
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>ConsoleApplication1.cpp
1>
1>项目性能摘要:
1>      884 毫秒 C:\Users\xunwu\source\repos\ConsoleApplication1\ConsoleApplication1.vcxproj   1 次调用
1>
1>目标性能摘要:
1>        0 毫秒 _SplitProjectReferencesByFileExistence     1 次调用
1>        0 毫秒 ResolveAssemblyReferences                  1 次调用
1>        0 毫秒 ExpandSDKReferences                        1 次调用
1>        0 毫秒 ResolveSDKReferences                       1 次调用
1>        0 毫秒 ResolveProjectReferences                   1 次调用
1>        0 毫秒 PrepareProjectReferences                   1 次调用
1>        0 毫秒 FindReferenceAssembliesForReferences       1 次调用
1>        0 毫秒 SelectClCompile                            1 次调用
1>        0 毫秒 AssignProjectConfiguration                 1 次调用
1>        0 毫秒 BeforeResolveReferences                    1 次调用
1>        0 毫秒 ComputeCLInputPDBName                      1 次调用
1>        0 毫秒 ComputeMIDLGeneratedCompileInputs          1 次调用
1>        0 毫秒 _SelectedFiles                             1 次调用
1>        0 毫秒 GetReferencedVCProjectsInfo                1 次调用
1>        0 毫秒 ComputeReferenceCLInput                    1 次调用
1>        0 毫秒 WarnCompileDuplicatedFilename              1 次调用
1>        0 毫秒 SetCABuildNativeEnvironmentVariables       1 次调用
1>        0 毫秒 GetReferenceAssemblyPaths                  1 次调用
1>        0 毫秒 GetFrameworkPaths                          1 次调用
1>        0 毫秒 SelectCustomBuild                          1 次调用
1>        0 毫秒 GetResolvedWinMD                           1 次调用
1>        0 毫秒 _PrepareForReferenceResolution             1 次调用
1>        0 毫秒 AfterResolveReferences                     1 次调用
1>        0 毫秒 ResolveReferences                          1 次调用
1>        1 毫秒 SetBuildDefaultEnvironmentVariables        1 次调用
1>        1 毫秒 _CheckForInvalidConfigurationAndPlatform   1 次调用
1>        1 毫秒 _CheckWindowsSDKInstalled                  1 次调用
1>        1 毫秒 _GetProjectReferenceTargetFrameworkProperties   1 次调用
1>        1 毫秒 FixupCLCompileOptions                      1 次调用
1>        2 毫秒 InitializeBuildStatus                      1 次调用
1>        8 毫秒 PrepareForBuild                            1 次调用
1>      865 毫秒 ClCompile                                  1 次调用
1>
1>任务性能摘要:
1>        0 毫秒 Message                                    2 次调用
1>        0 毫秒 CheckVCToolsetVersion                      1 次调用
1>        0 毫秒 ReadLinesFromFile                          1 次调用
1>        0 毫秒 AssignProjectConfiguration                 1 次调用
1>        0 毫秒 MSBuild                                    1 次调用
1>        1 毫秒 SetEnv                                     5 次调用
1>        1 毫秒 MakeDir                                    2 次调用
1>        1 毫秒 WriteLinesToFile                           1 次调用
1>        1 毫秒 Touch                                      1 次调用
1>      864 毫秒 CL                                         2 次调用
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

  时间减半!

posted @   xnuwu  阅读(2534)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示