Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'ottimizzazione PGO (Profile-Guided Optimization) consente di ottimizzare un intero file eseguibile. L'utilità di ottimizzazione usa i dati delle esecuzioni di test del file .exe o .dll. I dati rappresentano le probabili prestazioni del programma in un ambiente di produzione.
Nota
SPGO (Sample Profile-Guided Optimization) è un approccio alternativo che utilizza i contatori delle prestazioni di Windows per la CPU hardware anziché la strumentazione. SPGO non richiede alcuna compilazione instrumentata: si profila un file binario di versione esistente usando xperf. Per ulteriori informazioni, consulta il tutorial di esempio su Sample Profile-Guided Optimization (SPGO).
Le ottimizzazioni guidate dal profilo sono disponibili solo per le destinazioni native x86, x64 o ARM64. Le ottimizzazioni guidate dal profilo non sono disponibili per i file eseguibili che vengono eseguiti su Common Language Runtime. Anche se si produce un assembly con codice nativo e gestito misto (usando l'opzione del compilatore /clr ), non è possibile usare l'ottimizzazione guidata dal profilo solo nel codice nativo. Se si tenta di compilare un progetto con queste opzioni impostate nell'IDE, viene restituito un errore di compilazione.
Nota
Le informazioni raccolte dalle esecuzioni dei test di profilatura sostituiscono le ottimizzazioni che altrimenti sarebbero attive se si specifica /Ob, /Os o /Ot. Per ulteriori informazioni, vedere /Ob (espansione della funzione inline) e /Os, /Ot (Favorire codice piccolo, Favorire codice rapido).
Passaggi per ottimizzare l'app
Per usare l'ottimizzazione guidata dal profilo, seguire questa procedura per ottimizzare l'app:
Compilare uno o più file di codice sorgente con /GL.
Il compilatore esamina ogni modulo compilato con /GL durante le esecuzioni dei test di ottimizzazione guidata dal profilo per acquisire il comportamento di runtime. Non è necessario compilare ogni modulo in una compilazione di ottimizzazione guidata dal profilo con /GL. Tuttavia, solo i moduli compilati con /GL vengono instrumentati e successivamente disponibili per le ottimizzazioni con profilo guidato.
Eseguire il collegamento usando /LTCG e /GENPROFILE o /FASTGENPROFILE.
Quando si usano sia /LTCG che /GENPROFILE o /FASTGENPROFILE, l'app strumentata crea un file
.pgdquando viene eseguita. Dopo l'aggiunta dei dati di esecuzione del test al.pgdfile, è possibile usarli come input per il passaggio di collegamento successivo (creazione dell'immagine ottimizzata). Quando si specifica /GENPROFILE, è possibile aggiungere facoltativamente un argomento PGD=filename per specificare un nome o un percorso non predefiniti per il.pgdfile. La combinazione di /LTCG e /GENPROFILE o /FASTGENPROFILE sostituisce l'opzione del linker deprecata /LTCG:PGINSTRUMENT.Profilare l'applicazione.
Ogni volta che una sessione EXE profilata termina o viene scaricata una DLL profilata, il processo crea un
appname!N.pgcfile. Un.pgcfile contiene informazioni su una determinata esecuzione di test dell'applicazione. appname è il nome dell'app e N è un numero che inizia con 1. Incrementa in base al numero di altriappname!N.pgcfile nella directory. È possibile eliminare un.pgcfile se l'esecuzione del test non rappresenta uno scenario da ottimizzare.Durante un'esecuzione di test, è possibile forzare la chiusura del file attualmente aperto
.pgce la creazione di un nuovo.pgcfile usando l'utilità pgosweep , ad esempio quando la fine di uno scenario di test non coincide con l'arresto dell'applicazione.L'applicazione può anche richiamare direttamente una funzione PGO, PgoAutoSweep, per acquisire i dati del profilo al momento della chiamata come
.pgcfile. Può fornire un controllo più corretto sul codice coperto dai dati acquisiti nei.pgcfile. Per un esempio di come usare questa funzione, vedere la documentazione di PgoAutoSweep .Quando si crea la compilazione instrumentata, per impostazione predefinita, la raccolta dei dati viene eseguita in modalità non thread-safe, che è più veloce ma può essere imprecisa. Usando l'argomento EXACT per /GENPROFILE o /FASTGENPROFILE, è possibile specificare la raccolta dei dati in modalità thread-safe, più precisa, ma più lenta. Questa opzione è disponibile anche se si imposta la variabile di ambiente deprecata PogoSafeMode, o l'opzione del linker deprecata /POGOSAFEMODE, quando si crea la build strumentata.
Eseguire il collegamento usando /LTCG e /USEPROFILE.
Usare le opzioni del linker /LTCG e /USEPROFILE per creare un'immagine ottimizzata. Questo passaggio accetta il
.pgdfile come input. Quando si specifica /USEPROFILE, è possibile aggiungere facoltativamente un argomento PGD=filename per specificare un nome o un percorso non predefiniti per il.pgdfile. È anche possibile specificare questo nome usando l'opzione deprecata /PGD linker. La combinazione delle opzioni del linker /LTCG e /USEPROFILE sostituisce le opzioni del linker deprecate /LTCG:PGOPTIMIZE e /LTCG:PGUPDATE.
È anche possibile creare il file eseguibile ottimizzato e successivamente determinare che una maggiore profilatura sarebbe utile per creare un'immagine più ottimizzata. Se l'immagine instrumentata e il relativo .pgd file sono disponibili, è possibile eseguire più esecuzioni di test e ricompilare l'immagine ottimizzata con il file più recente .pgd usando le stesse opzioni del linker /LTCG e /USEPROFILE .
Nota
Entrambi .pgc i file e .pgd sono tipi di file binari. Se vengono archiviati in un sistema di controllo del codice sorgente, evitare qualsiasi trasformazione automatica che potrebbe essere eseguita nei file di testo.
Ottimizzazioni eseguite da PGO
Le ottimizzazioni guidate dal profilo includono questi controlli e miglioramenti:
Inlining - Ad esempio, se la funzione A chiama frequentemente la funzione B e la funzione B è relativamente piccola, le ottimizzazioni guidate dal profilo incorporano la funzione B nella funzione A.
Speculazione di chiamata virtuale: se una chiamata virtuale, o un'altra chiamata attraverso un puntatore di funzione, è spesso indirizzata a una determinata funzione, un'ottimizzazione guidata dal profilo può inserire una chiamata diretta eseguita condizionalmente alla funzione frequentemente bersaglio, e la chiamata diretta può essere inserita direttamente.
Allocazione dei registri - ottimizzazione basata sui dati del profilo comporta una migliore allocazione dei registri.
Ottimizzazione dei Blocchi di Base: l'ottimizzazione dei blocchi di base consente di collocare i blocchi di base che vengono eseguiti frequentemente entro lo stesso frame nello stesso set di pagine (località). Riduce al minimo il numero di pagine usate, riducendo al minimo il sovraccarico di memoria.
Ottimizzazione dimensioni/velocità: le funzioni in cui il programma impiega il tempo di esecuzione più elevato possono essere ottimizzate per la velocità.
Layout delle funzioni: in base al grafico delle chiamate e al comportamento profilato di chiamante e chiamato, le funzioni che tendono a trovarsi lungo lo stesso percorso di esecuzione comune vengono posizionate nella stessa sezione.
Ottimizzazione del ramo condizionale - Con le sonde di valore, le ottimizzazioni guidate dal profilo possono determinare se un determinato valore in un'istruzione switch viene usato più spesso di altri valori. Quindi è possibile estrarre questo valore dall'istruzione switch. La stessa ottimizzazione può essere eseguita con le istruzioni
if...else, in cui l'ottimizzatore può ordinareif...elsein modo che il bloccoifo quelloelsesia posizionato per primo, a seconda di quale dei due blocchi sia più spesso vero.Separazione del codice morto - l'ottimizzazione guidata dal profilo sposta il codice che non viene chiamato durante la profilazione in una sezione speciale alla fine dell'insieme di sezioni. Impedisce efficacemente a questa sezione di essere inclusa nelle pagine usate di frequente.
Separazione del codice EH: poiché il codice EH viene eseguito solo in modo eccezionale, spesso può essere spostato in una sezione separata. Le ottimizzazioni guidate dal profilo lo spostano quando determinano che le eccezioni si verificano solo in condizioni eccezionali.
Intrinseci di memoria - La possibilità di espandere o meno un intrinseco dipende dalla frequenza con cui viene chiamato. Una funzione intrinseca può anche essere ottimizzata in base alla dimensione dei blocchi di spostamento o copia.
Passaggi successivi
Per altre informazioni su queste variabili di ambiente, funzioni e strumenti che è possibile usare nelle ottimizzazioni con profilo guidato, vedere le risorse seguenti:
Variabili di ambiente per le ottimizzazioni guidate dal profilo
Queste variabili specificano il comportamento di runtime degli scenari di test. Sono ora deprecati e sostituiti da nuove opzioni del linker. Questo documento illustra come passare dalle variabili di ambiente alle opzioni del linker.
PgoAutoSweep
Una funzione che è possibile aggiungere all'app per fornire un controllo granulare sull'acquisizione dei dati del file .pgc.
pgosweep
Utilità della riga di comando che scrive tutti i dati del profilo nel .pgc file, chiude il .pgc file e apre un nuovo .pgc file.
pgomgr
Utilità della riga di comando che aggiunge i dati del profilo da uno o più .pgc file al .pgd file.
Procedura: Unire più profili PGO in un singolo profilo
Esempi di utilizzo di pgomgr .
Tutorial di esempio su Profile-Guided Optimization (SPGO)
Usare i contatori delle prestazioni hardware della CPU anziché la strumentazione. Nessuna build strumentata richiesta: profila il tuo binario di release esistente con xperf.