共用方式為


PgoAutoSweep

PgoAutoSweep 會將目前的配置檔計數器資訊儲存至檔案,然後重設計數器。 在配置檔引導優化定型期間使用 函式,將所有配置檔數據從執行中的程式寫入檔案 .pgc ,以供稍後在優化組建中使用。

語法

void PgoAutoSweep(const char* name);    // ANSI/MBCS
void PgoAutoSweep(const wchar_t* name); // UNICODE

參數

name
識別已儲存 .pgc 檔案的字串。

備註

您可以從應用程式呼叫 PgoAutoSweep ,在應用程式執行期間隨時儲存和重設配置檔數據。 在檢測的組建中,擷 PgoAutoSweep 取目前的分析數據、將它儲存在檔案中,並重設配置檔計數器。 相當於在可執行檔的特定點呼叫 pgosweep 命令。 在優化的組建中, PgoAutoSweep 是無作業。

儲存的配置檔計數器數據會放在名為 base_name 名稱的-檔案中!value.pgc,其中base_name是可執行檔的基底名稱,name 是傳遞至 PgoAutoSweep的參數,value 是唯一值,通常是單調增加的數位,以防止檔名衝突。

.pgcPgoAutoSweep建立的檔案必須合併到.pgd檔案中,才能用來建立優化的可執行檔。 您可以使用 pgomgr 命令來執行合併。

您可以在優化建置期間,使用PGD=filename自變數將合併.pgd檔案的名稱傳遞至 /USEPROFILE 連結器選項,或使用已被取代的 /PGD 連結器選項。 如果您將 .pgc 檔案合併至名為 base_name.pgd 的檔案,則不需要在命令行上指定檔名,因為鏈接器預設會挑選此檔名。

PgoAutoSweep 式會維護建立檢測組建時所指定的線程安全性設定。 如果您使用預設設定,或指定 /GENPROFILE 或 /FASTGENPROFILE 連結器選項的 NOEXACT 自變數,則 對 PgoAutoSweep 的呼叫不是安全線程。 EXACT 自變數會建立安全且更精確的線程,但較慢且檢測的可執行檔。

需求

常式 必要的標頭
PgoAutoSweep <pgobootrun.h>

可執行文件必須在連結的連結庫中包含 pgobootrun.lib 檔案。 此檔案包含在 Visual Studio 安裝中,每個支援的架構的 VC 連結庫目錄中。

範例

下列範例會使用 PgoAutoSweep 在執行期間在不同的點建立兩個 .pgc 檔案。 第一個包含描述運行時間行為直到 count 等於 3 的數據,而第二個數據則包含在此點之後收集的數據,直到應用程式終止之前為止。

// pgoautosweep.cpp
// Compile by using: cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
// Link to instrument: link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
// Run to generate data: pgoautosweep
// Merge data by using command line pgomgr tool:
// pgomgr /merge pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc pgoautosweep.pgd
// Link to optimize: link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj

#include <iostream>
#include <windows.h>
#include <pgobootrun.h>

void func2(int count)
{
    std::cout << "hello from func2 " << count << std::endl;
    Sleep(2000);
}

void func1(int count)
{
    std::cout << "hello from func1 " << count << std::endl;
    Sleep(2000);
}

int main()
{
    int count = 10;
    while (count--)
    {
        if (count < 3)
            func2(count);
        else
        {
            func1(count);
            if (count == 3)
            {
                PgoAutoSweep("func1");
            }
        }
    }
    PgoAutoSweep("func2");
}

在開發人員命令提示字元中,使用此命令將程式代碼編譯為物件檔:

cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp

然後使用下列命令產生已檢測的組建以進行定型:

link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj

執行已檢測的可執行檔來擷取定型數據。 呼叫 PgoAutoSweep 的數據輸出會儲存在名為 pgoautosweep-func1!1.pgc 和 pgoautosweep-func2!1.pgc 的檔案中。 程序的輸出看起來應該像這樣,因為它執行:

hello from func1 9
hello from func1 8
hello from func1 7
hello from func1 6
hello from func1 5
hello from func1 4
hello from func1 3
hello from func2 2
hello from func2 1
hello from func2 0

執行 pgomgr 命令,將已儲存的數據合併至設定檔定型 資料庫:

pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc

此指令輸出看起來像這樣:

Microsoft (R) Profile Guided Optimization Manager 14.13.26128.0
Copyright (C) Microsoft Corporation. All rights reserved.

Merging pgoautosweep-func1!1.pgc
pgoautosweep-func1!1.pgc: Used  3.8% (22304 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.
Merging pgoautosweep-func2!1.pgc
pgoautosweep-func2!1.pgc: Used  3.8% (22424 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.

現在您可以使用此定型數據來產生優化的組建。 使用此指令來建置優化的可執行檔案:

link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj

Microsoft (R) Incremental Linker Version 14.13.26128.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Merging pgoautosweep!1.pgc
pgoautosweep!1.pgc: Used  3.9% (22904 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.
  Reading PGD file 1: pgoautosweep.pgd
Generating code

0 of 0 ( 0.0%) original invalid call sites were matched.
0 new call sites were added.
294 of 294 (100.00%) profiled functions will be compiled for speed
348 of 1239 inline instances were from dead/cold paths
294 of 294 functions (100.0%) were optimized using profile data
16870 of 16870 instructions (100.0%) were optimized using profile data
Finished generating code

另請參閱

特性指引最佳化
pgosweep