Condividi tramite


Ottimizzazioni guidate da profilo (PGO)

Le ottimizzazioni guidate da profilo consentono di ottimizzare i file di output, in cui vengono utilizzati i dati delle esecuzioni di test del file exe o dll. I dati rappresentano la probabile modalità di funzionamento del programma in un ambiente di produzione.

Le ottimizzazioni PGO sono disponibili solo per x86 o per destinazioni native di x64. non per file di output eseguiti in Common Language Runtime. Anche se si genera un assembly con codice misto nativo e gestito (compilando, quindi, con /clr), non sarà possibile utilizzare le ottimizzazioni PGO nel solo codice nativo. Se si tenta di compilare un progetto con queste opzioni impostate nell'IDE, si verificherà un errore di compilazione.

Nota

Le informazioni raccolte dall'esecuzione dei test di profilatura eseguiranno l'override delle ottimizzazioni altrimenti attive se si specifica /Ob, /Os o /Ot.Per ulteriori informazioni, vedere /Ob (Espansione funzioni inline) e /Os, /Ot (Ottimizza per dimensione codice, Ottimizza per velocità codice).

Di seguito vengono fornite informazioni preliminari sull'utilizzo delle ottimizzazioni PGO:

  • Compilare uno o più file di codice sorgente con /GL.

    Ciascun modulo compilato con /GL può essere esaminato durante le esecuzioni di test delle ottimizzazioni PGO per individuare il comportamento in fase di esecuzione. È necessario che tutti i moduli di una build con ottimizzazione PGO non vengano compilati con /GL. Tuttavia, solo i moduli compilati con /GL verranno instrumentati e resi in seguito disponibili per le ottimizzazioni PGO.

  • Collegare con /LTCG:PGINSTRUMENT.

    /LTCG:PGINSTRUMENT crea un file pgd vuoto. Una volta aggiunti i dati delle esecuzioni di test, il file pgd potrà essere utilizzato come input per il successivo passaggio di collegamento, a partire dal quale verrà creata l'immagine ottimizzata. Quando si specifica /LTCG:PGINSTRUMENT, è possibile specificare /PGD con un nome o un percorso non predefinito per il file pgd.

  • Profilare l'applicazione.

    Ogni volta che viene completata una sessione EXE profilata o caricata una DLL profilata, viene creato un file appname!#.pgc. In un file pgc sono contenute informazioni relative all'esecuzione di test di una specifica applicazione. # è un numero che, a partire da 1, viene incrementato in base al numero di altri file appname!#.pgc presenti nella directory. Se l'esecuzione di test non rappresenta lo scenario che si desidera ottimizzare, è possibile eliminare un file pgc.

    Durante un'esecuzione di test, è possibile imporre la chiusura del file pgc attualmente aperto e la creazione di un nuovo file pgc con l'utilità pgosweep, ad esempio quando uno scenario di test non coincide con la chiusura dell'applicazione.

    È possibile utilizzare l'opzione PogoSafeMode quando si profila l'applicazione. Questa opzione consente di specificare se si desidera profilare l'applicazione in modalità sicura o in modalità veloce. Per ulteriori informazioni su queste modalità, vedere PogoSafeMode.

  • Collegare con /LTCG:PGOPTIMIZE.

    /LTCG:PGOPTIMIZE crea l'immagine ottimizzata. In questo passaggio il file pgd viene accettato come input. Per ulteriori informazioni, vedere /LTCG:PGOPTIMIZE.

È inoltre possibile creare il file di output ottimizzato e, in un momento successivo, stabilire quale profilatura aggiuntiva risulterà utile per creare un'immagine ulteriormente ottimizzata. Se l'immagine instrumentata e il relativo file pgd sono disponibili, è possibile eseguire test aggiuntivi e rigenerare l'immagine ottimizzata con il file pgd più recente.

Di seguito è riportato un elenco delle ottimizzazioni PGO:

  • Inline – Se ad esempio una funzione A chiama di frequente la funzione B e quest'ultima non ha dimensioni eccessive, le ottimizzazioni PGO incorporeranno la funzione B nella funzione A.

  • Specularità di chiamate virtuali – Se una chiamata virtuale, o eseguita tramite un puntatore a funzione, è destinata di frequente a una determinata funzione, un'ottimizzazione PGO potrà inserire una chiamata diretta eseguita condizionalmente nella funzione chiamata di frequente, incorporando la chiamata diretta.

  • Allocazione dei registri – L'ottimizzazione con dati di profilo consente una migliore allocazione dei registri.

  • Ottimizzazione dei blocchi di base – Grazie all'ottimizzazione dei blocchi di base, i blocchi di base utilizzati più di frequente, temporaneamente in esecuzione all'interno di uno specifico frame, possono essere inseriti nello stesso set di pagine (località). In questo modo, verrà ridotto il numero di pagine in uso e quindi il sovraccarico di memoria.

  • Ottimizzazione della velocità e delle dimensioni – È possibile velocizzare le funzioni per cui è richiesto un tempo prolungato.

  • Layout delle funzioni – In base al grafico della chiamata e al comportamento chiamante/chiamato, le funzioni che si trovano spesso sullo stesso percorso di esecuzione vengono inserite nella stessa sezione.

  • Ottimizzazione delle diramazioni condizionali – Tramite prove dei valori, le ottimizzazioni PGO riescono a rilevare se un determinato valore in un'istruzione switch viene utilizzato più frequentemente di altri. In caso, il valore viene estratto dall'istruzione. La stessa operazione può essere eseguita con istruzioni if/else: l'utilità di ottimizzazione dispone i blocchi if ed else dando precedenza a quello che viene verificato più di frequente.

  • Separazione del codice non utilizzato – Il codice non utilizzato durante le operazioni di profilatura viene spostato in una sezione speciale, che viene accodata alla fine dell'insieme di sezioni, in modo da rimanere separata dalle pagine utilizzate frequentemente.

  • Separazione del codice EH – Il codice EH, eseguito in caso di eccezioni, può essere spostato in una sezione separata, se le ottimizzazioni PGO sono in grado di stabilire che le eccezioni verranno generate solo in circostanze particolari.

  • Intrinseci di memoria – L'espansione degli intrinseci può essere effettuata in modo ottimale se è possibile determinare che un intrinseco viene chiamato frequentemente. Un intrinseco può inoltre essere ottimizzato in base alla dimensione del blocco delle operazioni di spostamento o copia.

Per ulteriori informazioni, vedere Walkthrough: Using Profile-Guided Optimizations.

Argomenti della sezione

Strumenti per l'ottimizzazione PGO (Profile Guided Optimization, Ottimizzazione guidata da profilo)

Procedura: unire più profili PGO in un unico profilo

Vedere anche

Riferimenti

Strumenti per la compilazione in C/C++