1. 程式人生 > 實用技巧 >visual studio 生成預編譯頭節省編譯時間

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的縮寫。

#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 個 ==========

  時間減半!