剖析資料導向最佳化(PGO)是一種編譯器最佳化技術,會利用執行階段的剖析資料來產生效率更高的原生程式碼。 使用 PGO 時,編譯器會根據應用程式實際執行方式重新排列程式碼,從而提升指令快取的利用率、更小的程式碼大小以及更快的執行速度。
Important
桌面版 Windows 應用程式 SDK 應用程式使用標準的 MSVC PGO 工作流程。 與 UWP 應用程式不同,桌面應用程式不需要手動複製 pgort140.dll 到應用程式套件中——PGO 執行時函式庫可透過標準的 C/C++ 執行環境取得。
PGO 運作方式
PGO 是一個三步驟流程:
- 樂器 — 啟用儀器功能來建立你的應用程式。 編譯器會插入探測,記錄你的程式碼執行情況。
-
設定檔 — 執行儀器化應用程式,練習你最重要的情境。 資料分析資料會被儲存到
.pgc檔案中。 - 優化 — 利用分析資料重建你的應用程式。 編譯器會根據實際執行時的行為來優化程式碼排版、內嵌與分支。
步驟指南
1. 設定釋放
將你的解決方案設定設為 Release (或其他能產生最佳化程式碼的設定)。 PGO 在除錯建置中沒有優勢。
2. 啟用整個程式的最佳化
在你的專案屬性中,進入 C/C++>Optimization,確認 Whole Program Optimization/GL () 是否啟用。
3. 為建構進行儀器化
前往 連結>器優化 ,並將 連結時間碼產生 設定為 配置導向優化工具 (/LTCG:PGInstrument)。
組建您的解決方案。 系統會隨著您的建置輸出一併產生一個 .pgd 檔案。
4. 啟動你的應用程式並收集個人資料
執行你的應用程式,並練習你想要優化的情境——啟動、導航、資料處理,或任何對效能至關重要的工作流程。 應用程式運行時,使用 pgosweep.exe MSVC工具組內建的工具來收集分析資料:
pgosweep.exe MyApp.exe MyApp!Scenario1.pgc
你可以為不同情境收集多個 .pgc 檔案。
5. 合併個人資料(可選)
預設會在最佳化步驟中自動合併所有放在 .pgd 檔案旁邊的 .pgc 檔案。 要對某些情境做不同的權重,請使用以下 pgomgr.exe 工具:
pgomgr.exe -merge:3 MyApp!CoreScenario.pgc MyApp.pgd
這會使 CoreScenario 執行作業的優先順序提高為其他執行作業的三倍。
6. 優化建構
回到 連結>器優化 ,並將 連結時間碼生成 設為 設定檔導向優化 - 優化 (/LTCG:PGOptimize)。
重建解決方案。 連結器會自動合併所有 .pgc 檔案,並根據分析資料產生優化的二進位檔。
有效運用 PGO 的技巧
- 刻畫真實情境。 PGO 優化的品質取決於你的分析流程有多具代表性。 練習使用者實際會遇到的程式碼路徑。
- 合併多次執行結果。 從多種不同使用情境收集分析資料,涵蓋廣泛的程式碼路徑。
- 在程式碼有重大變更時,重新進行效能分析。 當你對程式碼庫做重大修改時,設定檔資料就會變得過時。 定期重新儀器和重新剖面。
- 衡量影響。 比較 PGO 前後的啟動時間、吞吐量與記憶體使用情況,以驗證優化的價值。