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 个 ========== |
时间减半!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架