Dela via


Profilstyrda optimeringar

Med profilstyrd optimering (PGO) kan du optimera en hel körbar fil, där optimeraren använder data från testkörningar av .exe- eller .dll-filen. Data representerar programmets sannolika prestanda i en produktionsmiljö.

Profilstyrda optimeringar är endast tillgängliga för inbyggda x86-, x64- eller ARM64-mål. Profilstyrda optimeringar är inte tillgängliga för körbara filer som körs på den vanliga språkkörningen. Även om du skapar en sammansättning med blandad intern och hanterad kod (med hjälp av kompileringsalternativet /clr ) kan du inte använda profilstyrd optimering på bara den interna koden. Om du försöker skapa ett projekt med de här alternativen angivna i IDE resulterar ett build-fel.

Anmärkning

Information som samlas in från profileringstestkörningar åsidosätter optimeringar som annars skulle gälla om du anger /Ob, /Os eller /Ot. För mer information, se /Ob (Inlinefunktionsexpansion) och /Os, /Ot (Prioritera litet kod, Prioritera snabb kod).

Steg för att optimera din app

Om du vill använda profilstyrd optimering följer du dessa steg för att optimera din app:

  • Kompilera en eller flera källkodsfiler med /GL.

    Varje modul som skapats med /GL kan undersökas under profilstyrda optimeringstestkörningar för att samla in körningsbeteende. Varje modul i en profilstyrd optimeringsversion behöver inte kompileras med /GL. Men endast de moduler som kompileras med /GL är instrumenterade och senare tillgängliga för profilstyrda optimeringar.

  • Länka med /LTCG och /GENPROFILE eller /FASTGENPROFILE.

    Med både /LTCG och /GENPROFILE eller /FASTGENPROFILE skapas en .pgd fil när den instrumenterade appen körs. När testkörningsdata har lagts till i .pgd filen kan de användas som indata till nästa länksteg (skapa den optimerade avbildningen). När du anger /GENPROFILE kan du lägga till ett PGD=filename-argument för att ange ett nondefault-namn eller en plats för .pgd filen. Kombinationen av länkneralternativen /LTCG och /GENPROFILE eller /FASTGENPROFILE ersätter det föråldrade länkneralternativet /LTCG:PGINSTRUMENT.

  • Profilera programmet.

    Varje gång en profilerad EXE-session avslutas eller en profilerad DLL tas bort skapas en appname!N.pgc fil. En .pgc fil innehåller information om en viss programtestkörning. appname är namnet på din app och N är ett tal som börjar med 1 som ökas baserat på antalet andra appname!N.pgc filer i katalogen. Du kan ta bort en .pgc fil om testkörningen inte representerar ett scenario som du vill optimera.

    Under en testkörning kan du framtvinga stängning av den öppna .pgc filen och skapa en ny .pgc fil med verktyget pgosweep (till exempel när slutet av ett testscenario inte sammanfaller med programavstängning).

    Ditt program kan också direkt anropa en PGO-funktion, PgoAutoSweep, för att samla in profildata vid tidpunkten för anropet som en .pgc fil. Det kan ge dig bättre kontroll över koden som omfattas av de insamlade data i dina .pgc filer. Ett exempel på hur du använder den här funktionen finns i PgoAutoSweep-dokumentationen .

    När du skapar din instrumenterade version görs som standard datainsamling i icke-trådsäkert läge, vilket är snabbare men kan vara oprecist. Genom att använda argumentet EXACT till /GENPROFILE eller /FASTGENPROFILE kan du ange datainsamling i trådsäkert läge, vilket är mer exakt men långsammare. Det här alternativet är också tillgängligt om du anger den inaktuella miljövariabeln PogoSafeMode , eller det inaktuella /POGOSAFEMODE-länkalternativet , när du skapar din instrumenterade version.

  • Länka med /LTCG och /USEPROFILE.

    Använd både länkvalen /LTCG och /USEPROFILE för att skapa den optimerade avbildningen. Det här steget tar .pgd-filen som indata. När du anger /USEPROFILE kan du lägga till ett PGD=filename-argument för att ange ett namn eller en plats som inte är standard för .pgd filen. Du kan också ange det här namnet med hjälp av det inaktuella alternativet /PGD-länkare . Kombinationen av /LTCG och /USEPROFILE ersätter de inaktuella länkalternativen /LTCG:PGOPTIMIZE och /LTCG:PGUPDATE .

Det går till och med att skapa den optimerade körbara filen och senare fastställa att ytterligare profilering skulle vara användbar för att skapa en mer optimerad avbildning. Om den instrumenterade avbildningen och dess .pgd fil är tillgängliga kan du göra ytterligare testkörningar och återskapa den optimerade avbildningen med den nyare .pgd filen med hjälp av samma alternativ för /LTCG och /USEPROFILE-länkare .

Anmärkning

Både .pgc och .pgd filer är binära filtyper. Om det lagras i ett källkontrollsystem bör du undvika alla automatiska transformeringar som kan göras till textfiler.

Optimeringar som utförs av PGO

De profilstyrda optimeringarna omfattar dessa kontroller och förbättringar:

  • Inlining – Om till exempel en funktion A ofta anropar funktion B och funktion B är relativt liten, så infogar profilstyrda optimeringar funktion B i funktion A.

  • Spekulationer om virtuellt samtal – Om ett virtuellt anrop eller annat anrop via en funktionspekare ofta riktar sig mot en viss funktion kan en profilstyrd optimering infoga ett villkorligt utfört direktanrop till den ofta riktade funktionen och direktanropet kan infogas.

  • Registerallokering – Optimering baserat på profildata resulterar i bättre registerallokering.

  • Grundläggande blockoptimering – Med grundläggande blockoptimering kan vanliga grundläggande block som körs tillfälligt inom en viss ram placeras i samma uppsättning sidor (ort). Det minimerar antalet sidor som används, vilket minimerar minneskostnaderna.

  • Storleks-/hastighetsoptimering – Funktioner där programmet ägnar mest körningstid kan optimeras för hastighet.

  • Funktionslayout – Baserat på anropsdiagrammet och det profilerade samtals-/mottagarbeteendet placeras funktioner som tenderar att finnas längs samma exekveringsväg i samma avsnitt.

  • Optimering av villkorsstyrd gren – Med värdeavsökningarna kan profilstyrda optimeringar hitta om ett givet värde i en switch-instruktion används oftare än andra värden. Det här värdet kan sedan hämtas från switch-instruktionen. Detsamma kan göras med if...else-instruktioner där optimeraren kan ordna if...else så att antingen if-blocket eller else-blocket placeras först, beroende på vilket block som oftare är sant.

  • Dead Code Separation – Kod som inte anropas under profilering flyttas till ett specialavsnitt som läggs till i slutet av uppsättningen med avsnitt. Det håller effektivt det här avsnittet borta från de ofta använda sidorna.

  • EH Code Separation – Eftersom EH-kod endast körs undantagsvis kan den ofta flyttas till ett separat avsnitt. Den flyttas när profilstyrda optimeringar kan avgöra att undantagen endast sker under exceptionella förhållanden.

  • Memory Intrinsics – om du vill utöka en inbyggd eller inte beror på om den anropas ofta. En intrinsisk kan också optimeras baserat på storleken på blocken för flyttningar eller kopior.

Nästa steg

Läs mer om dessa miljövariabler, funktioner och verktyg som du kan använda i profilstyrda optimeringar:

Miljövariabler för profilstyrda optimeringar
Dessa variabler användes för att ange körningsbeteende för testscenarier. De är nu inaktuella och ersatta av nya länkalternativ. Det här dokumentet visar hur du flyttar från miljövariablerna till länkalternativen.

PgoAutoSweep
En funktion som du kan lägga till i din app för att tillhandahålla detaljerad .pgc kontroll över fildatainsamling.

pgosweep
Ett kommandoradsverktyg som skriver alla profildata till .pgc filen, stänger .pgc filen och öppnar en ny .pgc fil.

pgomgr
Ett kommandoradsverktyg som lägger till profildata från en eller flera .pgc filer till .pgd filen.

Anvisningar: Sammanfoga flera PGO-profiler i en enda profil
Exempel på pgomgr-användning .

Se även

Ytterligare MSVC-byggverktyg