共用方式為


特性指引最佳化

更新:2007 年 11 月

特性指引最佳化可以讓您最佳化輸出檔,其中的最佳化工具會使用來自 .exe 或 .dll 檔測試回合的資料。該資料表示程式在生產環境中可能執行的方式。

特性指引最佳化只適用於下列原生目標:x86、Itanium 處理器系列 (IPF) 或 x64。特性指引最佳化無法供將在 Common Language Runtime 上執行的輸出檔使用。即使以混合式原生且 Managed 的程式碼 (以 /clr 編譯) 生產組件,您也不能在僅原生的程式碼上使用特性指引最佳化。

注意事項:

從程式碼剖析測試回合所收集的資訊,會覆寫因您指定 /Ob/Os/Ot 而作用中的最佳化。如需詳細資訊,請參閱 /Ob (內嵌函式展開)/Os、/Ot (偏好小的程式碼、偏好快的程式碼)

以下是使用特性指引最佳化的處理流程概觀:

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

    每一個使用 /GL 建置的模組都可以在特性指引最佳化測試回合時進行檢查,以擷取執行階段行為。特性指引最佳化組建中並非每一個模組都一定要使用 /GL 進行編譯,但是只有使用 /GL 編譯的模組,才會進行檢測,而在將來供特性指引最佳化使用。

  • /LTCG:PGINSTRUMENT 連結。

    /LTCG:PGINSTRUMENT 會建立空白的 .pgd 檔。在測試回合資料加入至 .pgd 檔之後,它可以用來做為下一個連結步驟的輸入 (建立最佳化的影像)。指定 /LTCG:PGINSTRUMENT 時,您可以選擇用非預設的名稱或 .pgd 檔的位置,指定 /PGD

  • 分析應用程式。

    每次已分析的 EXE 工作階段 (Session) 結束或卸載已分析的 DLL 時,才會建立 appname!#.pgc 檔。.pgc 檔包含有關特定應用程式測試回合的資訊。# 是以 1 開始而根據目錄中其他 appname!#.pgc 檔的編號遞增的編號。如果測試回合不代表您要最佳化的案例,您可以刪除 .pgc 檔。

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

  • 與 /LTGC:PGOPTIMIZE 連結。

    /LTGC:PGOPTIMIZE 會建立最佳化的影像。這個步驟以 .pgd 檔做為輸入。如需詳細資訊,請參閱 /LTCG:PGOPTIMIZE

甚至也可能先建立最佳化的輸出檔,後來才決定其他分析對建立更進一步最佳化的影像會很有用。如果有檢測的影像及其 .pgd 檔可供使用,您可以另外再做測試回合,然後再用更新的 .pgd 檔重建最佳化影像。

以下是一份特性指引最佳化的清單:

  • 內嵌:例如,如果有經常呼叫函式 B 的函式 A,而函式 B 相當小,則特性指引最佳化會將函式 B 內嵌於函式 A 之中。

  • 虛擬呼叫推論 (Virtual Call Speculation):如果虛擬呼叫 (或其他透過函式指標的呼叫) 經常以特定函式為目標,特性指引最佳化可以插入有條件執行的直接呼叫,以呼叫經常做為目標的函式,而且直接呼叫可以內嵌。

  • 暫存器配置:利用分析資料最佳化會產生更好的暫存器配置。

  • 基底區塊最佳化:基底區塊最佳化可以讓暫時在某個框架內執行之最常執行的基底區塊放置在同一組頁面中 (區域性)。這樣可以將所用頁數減到最低,因此也能將記憶體負荷減到最低。

  • 大小/速度最佳化:程式耗費大量時間的函式可以最佳化以加快速度。

  • 函式配置:根據呼叫圖形和已分析的呼叫端/被呼叫端行為,可將傾向於沿著相同執行路徑的函式放置在相同的區段中。

  • 條件分支最佳化:特性指引最佳化可以利用值探查,找出 switch 陳述式中某個值是否比其他值更常使用,然後就可以將這個值從 switch 陳述式中抽出來。if/else 指示也可以執行相同的作業,最佳化工具可以在其中為 if/else 排序,而將 if 或 else 區塊依經常為 true 的區塊先放置在前。

  • 無作用程式碼分隔:將分析作業期間未呼叫的程式碼移入附加至區段集結尾的特殊區段中。這樣可以有效地將此區段排除在經常使用的頁面之外。

  • EH 程式碼分隔:在特性指引最佳化能夠判斷例外狀況只有在特殊情況下才發生時,特別執行的 EH 程式碼經常可以移入另外一個不同的區段中。

  • 記憶體內建:如果能夠判斷是否經常呼叫某個內建,就能對內建的擴充作出更好的決策。內建也可以根據移動或複製的區塊大小進行最佳化。

如需詳細資訊,請參閱逐步解說:使用特性指引最佳化

在本節中

特性指引最佳化工具

HOW TO:將多個 PGO 設定檔合併至單一設定檔

請參閱

參考

C/C++ 建置工具