预编译头(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的缩写。
#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的头文件
#include "stdafx.h"
创建main函数的cpp文件,试用stdafx.h
#include "stdafx.h" int main() { std::cout << "Hello World "; }
如下所示:
- 测试编译时间
已启动生成… 1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------ 1>stdafx.cpp 1>ConsoleApplication1.cpp 1> 1>项目性能摘要: 1> 1775 毫秒 C:Usersxunwusource eposConsoleApplication1ConsoleApplication1.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>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------ 1>stdafx.cpp 1>ConsoleApplication1.cpp 1> 1>项目性能摘要: 1> 1732 毫秒 C:Usersxunwusource eposConsoleApplication1ConsoleApplication1.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>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------ 1>ConsoleApplication1.cpp 1> 1>项目性能摘要: 1> 884 毫秒 C:Usersxunwusource eposConsoleApplication1ConsoleApplication1.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 个 ==========
时间减半!