預編譯頭(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\n"; }
如下所示:
- 測試編譯時間
已啟動生成… 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>------ 已啟動生成: 項目: 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>------ 已啟動生成: 項目: 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 個 ==========
時間減半!