特性指引最佳化
設定檔引導優化 (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
...else
,if
以便先放置 或else
區塊,視哪個區塊比較頻繁。else
不正確程式碼分離 - 在分析期間未呼叫的程式碼會移至附加至區段集結尾的特殊區段。 它有效地將本節保留在常用頁面外。
EH 程式碼區隔 - 因為 EH 程式碼只會特別執行,所以通常可以移至個別區段。 當分析引導優化可以判斷例外狀況只會發生例外狀況時,就會移動它。
記憶體內部 函數 - 是否要擴充內建函式,取決於其是否經常呼叫。 內建也可以根據移動或複製的區塊大小進行最佳化。
下一步
深入瞭解您可以在設定檔引導優化中使用的這些環境變數、函式和工具:
設定檔引導式優化的環境變數
這些變數用來指定測試案例的執行時間行為。 它們現在已被取代,並取代為新的連結器選項。 本檔說明如何將環境變數移至連結器選項。
PgoAutoSweep
您可以新增至應用程式的函式,以提供精細的 .pgc
檔案資料擷取控制項。
pgosweep
命令列公用程式,會將所有設定檔資料 .pgc
寫入檔案、關閉 .pgc
檔案,然後開啟新的 .pgc
檔案。
pgomgr
命令列公用程式,可將設定檔資料從一或多個 .pgc
檔案新增至 .pgd
檔案。
如何:將多個 PGO 設定檔合併成單一設定檔
pgomgr 使用方式的 範例。