C++項目的編譯應該越來越快才對
在Visual Studio 2019 16.2中,我們通過提升鏈接器性能來縮短工程的總體編譯時間。今天,我們很高興的引入一系列可以進一步提升編譯速度的新玩意兒,我們就先叫它C++ Build Insights吧。
你是否在一邊吃早餐一邊編譯代碼的時候想過:編譯器現在這會兒正在那鼓搗什麽呢?
在C++ Build Insights中,我們可以幫助你解答上面的問題。通過整合新的工具和Event Tracing for Windows(ETW),我們可以得到有關C++編譯工具鏈工作時的一些可視化信息。通過查看這些信息,我們可以知道到底是哪些工作項目拖慢了工程的整體構建速度,並從中對症下藥進行改進。
讓我們開始吧
當然了,你首先需要安裝Visual Studio 2019 v16.4 Preview 3。然後按照如下的幾個步驟開始收集構建時間信息。
> 以管理員啓動VS2019 Preview中的x64命令行程序。
> 執行: vcperf /start MySessionName。
> 編譯的工程。
> 執行:vcperf /stop MySessionName myTrace.etl。
在vcperf命令中,我們開始了一個監測會話,會話名稱被指定爲MySessionName。然後當執行vcperf /stop時,所有有關構建過程的性能檢測信息都將會寫入到myTrace.etl中。
借助ETW工具,C++ Build Insights可以收集到系統上所有正在運行的編譯器和鏈接器。你並不需要在執行vcperf時以命令行的方式編譯你的工程,你還是可以使用其他命令啓動編譯,甚至你直接可以使用Visual Studio進行編譯。不管使用哪種方式觸發編譯,都可以收集到對應的信息。
使用ETW獲取構建信息的另一個好處在于,你不需要在編譯或者鏈接過程中添加額外的命令行參數,因爲ETW內建在操作系統中並默認啓用。所以,C++ Build Insights將可以在所有的構建系統上正常工作,不需要添加任何的額外配置。
當完成信息的收集之後,你就可以在Windows Performance Analyzer(WPA)中打開Trace文件了。這個WPA是Windows Performance Toolkit的一部分。有關更多關于WPA版本的信息,可以參見C++ Build Insights的文檔。
圖形化呈現
在接下來的部分中,我將展示一些我們在WPA中呈現出來的一些構建時間的圖形化界面。
如果想要對工程的構建過程有一個大概的了解,就必須要知道整個構建工程中發生了哪些事情。Build Explorer是C++ Build Insights中的一個核心工具,主要用來呈現構建過程中的主要工序及花費的時間。你只需要從WPA中將左邊的Graph Explorer面板中拖到右邊的分析視圖中即可。在這個分析視圖中,我們可以基于這個分析視圖找到潛在的並行構建問題,構建的瓶頸,以及可以更加清楚的觀察到構建的時間主要集中在哪個階段(解析,代碼生成或者鏈接)。
更加詳盡的統計分析
潛藏最深的構建時間問題通常是那些緩慢發展而來的細小問題,它們會慢慢吞食你的構建時間,直到最後,當你發現構建的時間實在是難以接受時,才會意識到它們的存在。一個簡單的例子是,相同頭文件的包含在多個編譯單元中。每一次頭文件包含或許不會對整體的構建過程造成很大的影響,但是這個頭文件和其他的編譯單元一起包含的時候,問題就會出現了。C++ Build Insights可以提供詳盡的統計分析來提示潛在的警告來應對此類問題。
下面是一個例子,顯示出在構建過程中那些消耗時間最長的頭文件包含。你可以在WPA的左側的Graph Explorer中選擇文件視圖來查看這個信息。
可以得到的統計信息
總結
微軟啊,你真是爲我等大C++程序員操碎了心呐,我是真沒想到VS可以在優化我們的工程構建上下這麽大的功夫,但是呢,我的工程它也不大,也就百十來萬行(手動狗頭),所以,這套東西,還是留給有需要的人士吧。