Condividi tramite


PgoAutoSweep

PgoAutoSweep salva le informazioni del contatore del profilo corrente in un file e quindi reimposta i contatori. Usare la funzione durante il training di ottimizzazione guidata dal profilo per scrivere tutti i dati del profilo dal programma in esecuzione in un .pgc file per usarli successivamente nella compilazione di ottimizzazione.

Sintassi

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

Parametri

name
Stringa di identificazione per il file salvato .pgc .

Osservazioni:

È possibile chiamare PgoAutoSweep dall'applicazione per salvare e reimpostare i dati del profilo in qualsiasi momento durante l'esecuzione dell'applicazione. In una compilazione instrumentata acquisisce PgoAutoSweep i dati di profilatura correnti, lo salva in un file e reimposta i contatori del profilo. Equivale a chiamare il comando pgosweep in un punto specifico del file eseguibile. In una compilazione ottimizzata, PgoAutoSweep è un no-op.

I dati del contatore del profilo salvati vengono inseriti in un file denominato base_name-nome.value.pgc, dove base_name è il nome di base dell'eseguibile, name è il parametro passato a PgoAutoSweepe il valore è un valore univoco, in genere un numero che aumenta in modo monotonico, per evitare conflitti di nomi di file.

I .pgc file creati da PgoAutoSweep devono essere uniti in un .pgd file da usare per creare un eseguibile ottimizzato. È possibile usare il comando pgomgr per eseguire l'unione.

È possibile passare il nome del file unito .pgd al linker durante la compilazione di ottimizzazione usando l'argomento PGD=filename all'opzione del linker /USEPROFILE oppure usando l'opzione deprecata /PGD linker. Se si uniscono i .pgc file in un file denominato base_name.pgd, non è necessario specificare il nome file nella riga di comando, perché il linker seleziona questo nome file per impostazione predefinita.

La PgoAutoSweep funzione gestisce l'impostazione thread-safety specificata quando viene creata la compilazione instrumentata. Se si usa l'impostazione predefinita o si specifica l'argomento NOEXACT per l'opzione del linker /GENPROFILE o /FASTGENPROFILE, le chiamate a PgoAutoSweep non sono thread-safe. L'argomento EXACT crea un file eseguibile instrumentato e thread-safe e più accurato, ma più lento.

Requisiti

Ciclo Intestazione obbligatoria
PgoAutoSweep <pgobootrun.h>

L'eseguibile deve includere il file pgobootrun.lib nelle librerie collegate. Questo file è incluso nell'installazione di Visual Studio, nella directory delle librerie VC per ogni architettura supportata.

Esempio

L'esempio seguente usa PgoAutoSweep per creare due .pgc file in punti diversi durante l'esecuzione. Il primo contiene dati che descrivono il comportamento di runtime fino count a quando non è uguale a 3 e il secondo contiene i dati raccolti dopo questo punto fino alla chiusura dell'applicazione.

// 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");
}

In un prompt dei comandi per gli sviluppatori compilare il codice in un file oggetto usando questo comando:

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

Generare quindi una compilazione instrumentata per il training usando questo comando:

link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj

Eseguire l'eseguibile instrumentato per acquisire i dati di training. L'output dei dati dalle chiamate a PgoAutoSweep viene salvato nei file denominati pgoautosweep-func1!1.pgc e pgoautosweep-func2!1.pgc. L'output del programma dovrebbe essere simile al seguente durante l'esecuzione:

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

Unire i dati salvati in un database di training del profilo eseguendo il comando pgomgr :

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

L'output di questo comando è simile al seguente:

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.

È ora possibile usare questi dati di training per generare una compilazione ottimizzata. Usare questo comando per compilare l'eseguibile ottimizzato:

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

Vedi anche

Ottimizzazioni PGO
pgosweep