PgoAutoSweep
PgoAutoSweep
menyimpan informasi penghitung profil saat ini ke file, lalu mengatur ulang penghitung. Gunakan fungsi selama pelatihan pengoptimalan yang dipandu profil untuk menulis semua data profil dari program yang .pgc
sedang berjalan ke file untuk digunakan nanti dalam build pengoptimalan.
Sintaks
void PgoAutoSweep(const char* name); // ANSI/MBCS
void PgoAutoSweep(const wchar_t* name); // UNICODE
Parameter
nama
String identifikasi untuk file yang disimpan .pgc
.
Keterangan
Anda dapat memanggil PgoAutoSweep
dari aplikasi untuk menyimpan dan mengatur ulang data profil kapan saja selama eksekusi aplikasi. Dalam build berinstrumen, PgoAutoSweep
mengambil data pembuatan profil saat ini, menyimpannya dalam file, dan mengatur ulang penghitung profil. Ini setara dengan memanggil perintah pgosweep pada titik tertentu dalam executable Anda. Dalam build yang dioptimalkan, PgoAutoSweep
adalah no-op.
Data penghitung profil yang disimpan ditempatkan dalam file bernama base_name-name!value.pgc, di mana base_name adalah nama dasar yang dapat dieksekusi, nama adalah parameter yang diteruskan ke PgoAutoSweep
, dan nilai adalah nilai unik, biasanya angka yang meningkat secara monoton, untuk mencegah tabrakan nama file.
File .pgc
yang dibuat oleh PgoAutoSweep
harus digabungkan ke dalam file yang .pgd
akan digunakan untuk membuat executable yang dioptimalkan. Anda dapat menggunakan perintah pgomgr untuk melakukan penggabungan.
Anda dapat meneruskan .pgd
nama file gabungan ke linker selama build pengoptimalan dengan menggunakan argumen PGD=nama file ke opsi linker /USEPROFILE, atau dengan menggunakan opsi linker /PGD yang tidak digunakan lagi. Jika Anda menggabungkan .pgc
file ke dalam file bernama base_name.pgd, Anda tidak perlu menentukan nama file pada baris perintah, karena linker mengambil nama file ini secara default.
Fungsi ini PgoAutoSweep
mempertahankan pengaturan keamanan utas yang ditentukan saat build berinstrumentasi dibuat. Jika Anda menggunakan pengaturan default atau menentukan argumen NOEXACT ke opsi linker /GENPROFILE atau /FASTGENPROFILE , panggilan ke PgoAutoSweep
tidak aman utas. Argumen EXACT menciptakan eksekusi yang aman dan lebih akurat, tetapi lebih lambat dan berinstrumen.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
PgoAutoSweep |
<pgobootrun.h> |
Executable harus menyertakan file pgobootrun.lib dalam pustaka yang ditautkan. File ini disertakan dalam penginstalan Visual Studio Anda, di direktori pustaka VC untuk setiap arsitektur yang didukung.
Contoh
Contoh di bawah ini menggunakan PgoAutoSweep
untuk membuat dua .pgc
file di titik yang berbeda selama eksekusi. Yang pertama berisi data yang menjelaskan perilaku runtime sampai count
sama dengan 3, dan yang kedua berisi data yang dikumpulkan setelah titik ini sampai tepat sebelum penghentian aplikasi.
// 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");
}
Dalam perintah pengembang, kompilasi kode ke file objek dengan menggunakan perintah ini:
cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
Kemudian hasilkan build berinstrumentasi untuk pelatihan dengan menggunakan perintah ini:
link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
Jalankan executable berinstrumen untuk mengambil data pelatihan. Output data oleh panggilan ke PgoAutoSweep
disimpan dalam file bernama pgoautosweep-func1!1.pgc dan pgoautosweep-func2!1.pgc. Output program akan terlihat seperti ini saat berjalan:
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
Gabungkan data yang disimpan ke dalam database pelatihan profil dengan menjalankan perintah pgomgr :
pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc
Output perintah ini terlihat seperti ini:
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.
Sekarang Anda dapat menggunakan data pelatihan ini untuk menghasilkan build yang dioptimalkan. Gunakan perintah ini untuk membangun executable yang dioptimalkan:
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