Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med profilstyrd optimering (PGO) kan du optimera en hel körbar fil. Optimeraren använder data från testkörningar av filen .exe eller .dll. Data representerar programmets sannolika prestanda i en produktionsmiljö.
Anmärkning
SPGO (Sample Profile-Guided Optimization) är en alternativ metod som använder maskinvaru-CPU Windows prestandaräknare i stället för instrumentation. SPGO kräver ingen instrumenterad build – du profilerar en befintlig releasebinär med hjälp av xperf. Mer information finns i självstudiekursen om Profile-Guided-optimering (SPGO).
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.
Kompilatorn undersöker varje modul som skapats med /GL under profilstyrda optimeringstestkörningar för att samla in körningsbeteende. Du behöver inte kompilera varje modul i en profilstyrd optimeringsversion med /GL. Men endast moduler som kompileras med /GL är instrumenterade och senare tillgängliga för profilstyrda optimeringar.
Länka med /LTCG och /GENPROFILE eller /FASTGENPROFILE.
När du använder både /LTCG och /GENPROFILE eller /FASTGENPROFILE skapar den instrumenterade appen en
.pgdfil när den körs. När testkörningsdata har lagts till i.pgdfilen kan du använda dem 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.pgdfilen. 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 skapar processen en
appname!N.pgcfil. En.pgcfil innehåller information om en viss programtestkörning. appname är namnet på din app och N är ett tal som börjar med 1. Den ökar baserat på antalet andraappname!N.pgcfiler i katalogen. Du kan ta bort en.pgcfil om testkörningen inte representerar ett scenario som du vill optimera.Under en testkörning kan du framtvinga stängning av den öppna
.pgcfilen och skapandet av en ny.pgcfil med hjälp av 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
.pgcfil. Det kan ge dig bättre kontroll över koden som omfattas av de insamlade data i dina.pgcfiler. 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
.pgdfilen som indata. När du anger /USEPROFILE kan du lägga till ett PGD=filename-argument för att ange ett nondefault-namn eller en plats för.pgdfilen. Du kan också ange det här namnet med hjälp av det inaktuella alternativet /PGD-länkare . Kombinationen av alternativen /LTCG och /USEPROFILE-länkare 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 mer profilering skulle vara användbart för att skapa en mer optimerad avbildning. Om den instrumenterade avbildningen och dess .pgd fil är tillgängliga kan du göra fler testkörningar och återskapa den optimerade avbildningen med den nyare .pgd filen med samma alternativ för /LTCG och /USEPROFILE-länkare .
Anmärkning
Både .pgc och .pgd filer är binära filtyper. Om du lagrar dem i ett källkontrollsystem bör du undvika alla automatiska transformeringar som kan göras till textfiler.
Optimeringar som utförs av PGO
Profilstyrda optimeringar omfattar dessa kontroller och förbättringar:
Inlining - Till exempel, om funktion A ofta anropar funktion B och funktion B är relativt liten, infogar de profilstyrda optimeringarna 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. Samma optimering kan göras med instruktioner av typen
if...else, där optimeraren kan ordnaif...elseså att antingen blocketifeller blocketelseplaceras först, beroende på vilket block som är sant oftare.Dead Code Separation – Profilstyrd optimering flyttar kod som inte anropas under profilering till ett specialavsnitt i slutet av avsnittsuppsättningen. 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. Profilstyrda optimeringar flyttar den när de fastställer att undantagen endast sker under exceptionella förhållanden.
Memory Intrinsics – huruvida en intrinsik ska expanderas 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
Mer information om dessa miljövariabler, funktioner och verktyg som du kan använda i profilstyrda optimeringar finns i följande resurser:
Miljövariabler för profilstyrda optimeringar
Dessa variabler anger körningsbeteendet 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 .
Exempel på självstudie om profilstyrd optimering (SPGO)
Använd prestandaräknare för processormaskinvara i stället för instrumentation. Ingen instrumenterad version krävs – profilera din befintliga versionsbinär med xperf.