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 是唯一值,通常是單調增加的數位,以防止檔名衝突。
.pgc
所PgoAutoSweep
建立的檔案必須合併到.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