Share via


特性指引最佳化

設定檔引導優化 (PGO) 可讓您優化整個可執行檔,其中優化器會使用 .exe 或 .dll 檔案測試回合中的資料。 資料代表生產環境中程式可能效能。

設定檔引導優化僅適用于 x86、x64 或 ARM64 原生目標。 設定檔引導優化不適用於在 Common Language Runtime 上執行的可執行檔。 即使您產生具有混合原生和 Managed 程式碼的元件(使用 /clr 編譯器選項),您也無法只對原生程式碼使用設定檔引導優化。 如果您嘗試在 IDE 中設定這些選項來建置專案,則會產生建置錯誤。

注意

從分析測試回合收集的資訊會覆寫在您指定 /Ob /Os /Ot 時會生效的優化。 如需詳細資訊,請參閱 /Ob (內嵌函式擴充) /Os、/Ot (偏好小型程式碼、偏好快速程式碼)。

優化應用程式的步驟

若要使用設定檔引導式優化,請遵循下列步驟來優化您的應用程式:

  • 使用 /GL 編譯一或多個原始程式碼檔案。

    使用 /GL 建置的每個模組都可以在設定檔引導優化測試回合期間檢查,以擷取執行時間行為。 設定檔引導優化組建中的每個模組都不需要使用 /GL 進行編譯。 不過,只有使用 /GL 編譯的模組會經過檢測,稍後才能用於分析引導優化。

  • 使用 /LTCG /GENPROFILE 或 /FASTGENPROFILE 的連結。

    在執行已檢測的應用程式時,同時使用 /LTCG /GENPROFILE /FASTGENPROFILE 建立 .pgd 檔案。 將測試回合資料新增至 .pgd 檔案之後,就可以做為下一個連結步驟的輸入(建立優化映射)。 指定 /GENPROFILE 時,您可以選擇性地新增 PGD= filename 引數來指定檔案的非預設名稱或位置 .pgd /LTCG /GENPROFILE /FASTGENPROFILE 連結器選項的組合 會取代已被 取代的 /LTCG:PGINSTRUMENT 連結器選項。

  • 分析應用程式。

    每次剖析的 EXE 會話結束時,或卸載已分析的 DLL 時,都會建立檔案 appname!N.pgc 。 檔案 .pgc 包含特定應用程式測試回合的相關資訊。 appname 是您的應用程式名稱,而 N 是從 1 開始的數位,會根據目錄中的其他 appname!N.pgc 檔案數目遞增。 如果測試回合不代表您想要優化的案例,您可以刪除 .pgc 檔案。

    在測試回合期間,您可以強制關閉目前開啟 .pgc 的檔案,並使用 pgosweep 公用程式建立新 .pgc 檔案 (例如,當測試案例結尾與應用程式關閉不一致時)。

    您的應用程式也可以直接叫用 PGO 函式 PgoAutoSweep ,以擷取呼叫點的設定檔資料作為 .pgc 檔案。 它可讓您更精細地控制檔案 .pgc 中擷取的資料所涵蓋的程式碼。 如需如何使用此函式的範例,請參閱 PgoAutoSweep 檔。

    當您建立已檢測的組建時,根據預設,資料收集會以非執行緒安全模式完成,速度較快,但可能不精確。 藉由使用 EXACT 引數至 /GENPROFILE 或 /FASTGENPROFILE ,您可以在安全線程模式中指定資料收集,更精確,但速度較慢。 如果您設定已取代的 Pogo保管庫Mode 環境變數,或建立已檢測的組建時已被 取代的 /POGOSAFEMODE 連結器選項,也可以使用此選項。

  • 使用 /LTCG /USEPROFILE 的連結。

    使用 /LTCG /USEPROFILE 連結器選項來建立優化的映射。 此步驟會採用 作為檔案的 .pgd 輸入。 當您指定 /USEPROFILE 時,可以選擇性地新增 PGD= filename 引數來指定檔案的非預設名稱或位置 .pgd 您也可以使用已被取代 的 /PGD 連結器選項來指定此名稱。 /LTCG /USEPROFILE 的組合 會取代已被 取代的 /LTCG:PGOPTIMIZE /LTCG:PGUPDATE 連結器選項。

甚至可以建立優化的可執行檔,稍後判斷建立更優化的映射會很有用。 如果檢測的映射及其 .pgd 檔案可供使用,您可以使用相同的 /LTCG /USEPROFILE 連結器選項,執行其他測試回合,並使用較 .pgd 新的檔案重建優化映射。

注意

.pgc.pgd 檔案都是二進位檔案類型。 如果儲存在原始檔控制系統中,請避免對文字檔進行任何自動轉換。

PGO 所執行的優化

以設定檔引導的優化包括下列檢查和改進:

  • 內嵌 - 例如,如果函式 A 經常呼叫函式 B,而函式 B 相對較小,則分析引導優化會在函式 A 中內嵌函式 B。

  • 虛擬呼叫猜測 - 如果虛擬呼叫或其他透過函式指標呼叫,通常會以特定函式為目標,則以設定檔引導優化可以插入經常目標函式的有條件式直接呼叫,而直接呼叫可以內嵌。

  • 註冊配置 - 根據設定檔資料優化會導致更好的註冊配置。

  • 基本區塊優化 - 基本區塊優化 允許一般執行的基本區塊,這些區塊會暫時在指定的框架內執行,以放在相同頁面集(地區性)。 它會將所使用的頁面數目降至最低,以將記憶體額外負荷降到最低。

  • 大小/速度優化 - 程式花費最多執行時間的函式可以針對速度進行優化。

  • 函式配置 - 根據呼叫圖形和已分析的呼叫端/被呼叫端行為,通常會沿著相同執行路徑的函式放在相同的區段中。

  • 條件式分支優化 - 使用值探查時,剖析引導式 優化可以發現參數語句中的指定值是否比其他值更常使用。 然後此值會撤出 switch 陳述式。 您可以使用 ... 指示來完成 if 相同的作業,其中優化器可以排序 if ... elseif 以便先放置 或 else 區塊,視哪個區塊比較頻繁。 else

  • 不正確程式碼分離 - 在分析期間未呼叫的程式碼會移至附加至區段集結尾的特殊區段。 它有效地將本節保留在常用頁面外。

  • EH 程式碼區隔 - 因為 EH 程式碼只會特別執行,所以通常可以移至個別區段。 當分析引導優化可以判斷例外狀況只會發生例外狀況時,就會移動它。

  • 記憶體內部 函數 - 是否要擴充內建函式,取決於其是否經常呼叫。 內建也可以根據移動或複製的區塊大小進行最佳化。

下一步

深入瞭解您可以在設定檔引導優化中使用的這些環境變數、函式和工具:

設定檔引導式優化的環境變數
這些變數用來指定測試案例的執行時間行為。 它們現在已被取代,並取代為新的連結器選項。 本檔說明如何將環境變數移至連結器選項。

PgoAutoSweep
您可以新增至應用程式的函式,以提供精細的 .pgc 檔案資料擷取控制項。

pgosweep
命令列公用程式,會將所有設定檔資料 .pgc 寫入檔案、關閉 .pgc 檔案,然後開啟新的 .pgc 檔案。

pgomgr
命令列公用程式,可將設定檔資料從一或多個 .pgc 檔案新增至 .pgd 檔案。

如何:將多個 PGO 設定檔合併成單一設定檔
pgomgr 使用方式的 範例。

另請參閱

其他 MSVC 建置工具