visual studio 生成預編譯頭節省編譯時間
阿新 • • 發佈:2020-11-21
預編譯頭(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 個 ==========
時間減半!