Bagikan melalui


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

Baca juga

Pengoptimalan Yang Dipandu Profil
pgosweep