Profielgestuurde optimalisaties

Met profielgestuurde optimalisatie (PGO) kunt u een volledig uitvoerbaar bestand optimaliseren. De optimizer gebruikt gegevens uit testuitvoeringen van het .exe- of .dll-bestand. De gegevens vertegenwoordigen de waarschijnlijke prestaties van het programma in een productieomgeving.

Opmerking

SPGO (Sample Profile-Guided Optimization) is een alternatieve benadering die gebruikmaakt van hardware-CPU-prestatietellers van Windows in plaats van instrumentatie. SPGO vereist geen geïnstrumenteerde build - u profileert een bestaand release-binair bestand door xperf te gebruiken. Zie de zelfstudie Sample Profile-Guided Optimization (SPGO) voor meer informatie.

Profielgestuurde optimalisaties zijn alleen beschikbaar voor systeemeigen x86-, x64- of ARM64-doelen. Profielgestuurde optimalisaties zijn niet beschikbaar voor uitvoerbare bestanden die worden uitgevoerd in de algemene taalruntime. Zelfs als u een assembly met gemengde systeemeigen en beheerde code produceert (met behulp van de optie /clr-compiler ), kunt u niet alleen de systeemeigen code gebruiken om profielgestuurde optimalisatie te gebruiken. Als u probeert een project te bouwen met deze opties die zijn ingesteld in de IDE, wordt er een buildfout weergegeven.

Opmerking

Gegevens die worden verzameld uit profileringstests overschrijven optimalisaties die anders van kracht zouden zijn als u /Ob, /Os of /Ot opgeeft. Zie /Ob (Inline Function Expansion) en /Os, /Ot (Favor Small Code, Favor Fast Code)voor meer informatie.

Stappen voor het optimaliseren van uw app

Als u profielgestuurde optimalisatie wilt gebruiken, volgt u deze stappen om uw app te optimaliseren:

  • Compileer een of meer broncodebestanden met /GL.

    De compiler onderzoekt elke module die is gebouwd met /GL tijdens testuitvoeringen met profielgestuurde optimalisatie om runtimegedrag vast te leggen. U hoeft niet elke module te compileren in een profielgestuurde optimalisatiebuild met /GL. Alleen modules die zijn gecompileerd met /GL , zijn echter instrumenteerd en later beschikbaar voor profielgestuurde optimalisaties.

  • Maak een koppeling met behulp van /LTCG en /GENPROFILE of /FASTGENPROFILE.

    Wanneer u zowel /LTCG als /GENPROFILE of /FASTGENPROFILE gebruikt, maakt de geïnstrueerde app een .pgd bestand wanneer het wordt uitgevoerd. Nadat testuitvoeringsgegevens aan het .pgd bestand zijn toegevoegd, kunt u deze gebruiken als invoer voor de volgende koppelingsstap (het maken van de geoptimaliseerde afbeelding). Wanneer u /GENPROFILE opgeeft, kunt u desgewenst een PGD=bestandsnaamargument toevoegen om een niet-standaardnaam of locatie voor het .pgd bestand op te geven. De combinatie van de linkeropties /LTCG en /GENPROFILE of /FASTGENPROFILE vervangt de afgeschafte linkeroptie /LTCG:PGINSTRUMENT .

  • Profileer de toepassing.

    Telkens wanneer een geprofileerde EXE-sessie wordt beëindigd of een geprofileerd DLL-bestand wordt verwijderd, wordt er een appname!N.pgc bestand gemaakt. Een .pgc bestand bevat informatie over een bepaalde toepassingstestuitvoering. appname is de naam van uw app en N is een getal dat begint met 1. Het wordt verhoogd op basis van het aantal andere appname!N.pgc bestanden in de map. U kunt een .pgc bestand verwijderen als de testuitvoering geen scenario vertegenwoordigt dat u wilt optimaliseren.

    Tijdens een testuitvoering kunt u het momenteel geopende .pgc bestand geforceerd sluiten en een nieuw .pgc bestand maken met behulp van het hulpprogramma pgosweep (bijvoorbeeld wanneer het einde van een testscenario niet samenvalt met het afsluiten van de toepassing).

    Uw toepassing kan ook rechtstreeks een PGO-functie, PgoAutoSweep, aanroepen om de profielgegevens vast te leggen op het moment van de aanroep als een .pgc bestand. Het kan u meer controle geven over de code die wordt gedekt door de vastgelegde gegevens in uw .pgc bestanden. Zie de PgoAutoSweep-documentatie voor een voorbeeld van het gebruik van deze functie.

    Wanneer u uw geïnstrueerde build maakt, wordt het verzamelen van gegevens standaard uitgevoerd in de niet-threadveilige modus, wat sneller is, maar mogelijk onnauwkeurig is. Met het argument EXACT voor /GENPROFILE of /FASTGENPROFILE kunt u gegevensverzameling opgeven in de thread-veilige modus, wat nauwkeuriger, maar langzamer is. Deze optie is ook beschikbaar als u de afgeschafte Omgevingsvariabele PogoSafeMode of de afgeschafte linkeroptie /POGOSAFEMODE instelt wanneer u uw geïnstrueerde build maakt.

  • Koppel met /LTCG en /USEPROFILE.

    Gebruik zowel de linkeropties /LTCG als /USEPROFILE om de geoptimaliseerde afbeelding te maken. Met deze stap wordt het .pgd bestand als invoer gebruikt. Wanneer u /USEPROFILE opgeeft, kunt u desgewenst een PGD=bestandsnaamargument toevoegen om een niet-standaardnaam of locatie voor het .pgd bestand op te geven. U kunt deze naam ook opgeven met behulp van de afgeschafte linkeroptie /PGD. De combinatie van /LTCG en /USEPROFILE linker options vervangt de afgeschafte /LTCG:PGOPTIMIZE en /LTCG:PGUPDATE linker options.

Het is zelfs mogelijk om het geoptimaliseerde uitvoerbare bestand te maken en later te bepalen dat meer profilering nuttig is om een meer geoptimaliseerde afbeelding te maken. Als de geïnstrumenteerde afbeelding en het bijbehorende .pgd bestand beschikbaar zijn, kunt u meer testuitvoeringen uitvoeren en de geoptimaliseerde afbeelding opnieuw opbouwen met het nieuwere .pgd bestand met behulp van dezelfde linkeropties /LTCG en /USEPROFILE .

Opmerking

.pgc Zowel als .pgd bestanden zijn binaire bestandstypen. Als u ze opslaat in een broncodebeheersysteem, vermijdt u automatische transformatie die kan worden gemaakt in tekstbestanden.

Optimalisaties uitgevoerd door PGO

Profielgestuurde optimalisaties omvatten deze controles en verbeteringen:

  • Inlining - Als functie A bijvoorbeeld vaak functie B aanroept en functie B relatief klein is, voegen de profielgestuurde optimalisaties functie B inline in functie A in.

  • Virtual Call Speculatie - Als een virtuele aanroep of een andere aanroep via een functie-aanwijzer vaak gericht is op een bepaalde functie, kan een profielgestuurde optimalisatie een voorwaardelijk uitgevoerde directe aanroep naar de vaak gerichte functie invoegen en kan de directe aanroep inline worden gemaakt.

  • Registertoewijzing - Optimalisatie op basis van profielgegevens resulteert in betere registratietoewijzing.

  • Basisblokoptimalisatie : met basisblokoptimalisatie kunnen veelgebruikte basisblokken die tijdelijk binnen een bepaald frame worden uitgevoerd, in dezelfde set pagina's (lokaliteit) worden geplaatst. Het minimaliseert het aantal gebruikte pagina's, waardoor geheugenoverhead wordt geminimaliseerd.

  • Grootte-/snelheidsoptimalisatie : functies waar het programma de meeste uitvoeringstijd doorbrengt, kan worden geoptimaliseerd voor snelheid.

  • Functie-indeling : op basis van de oproepgrafiek en het gedrag van de geprofileerde aanroeper/aanroeper, worden functies die zich meestal in hetzelfde uitvoeringspad bevinden, in dezelfde sectie geplaatst.

  • Optimalisatie van voorwaardelijke vertakkingen : met de waardetests kunnen met profielgestuurde optimalisaties worden gevonden of een bepaalde waarde in een switchinstructie vaker wordt gebruikt dan andere waarden. Deze waarde kan vervolgens uit het switch-statement worden gehaald. Dezelfde optimalisatie kan worden uitgevoerd met if...else instructies waar de optimizer de if...else kan bestellen, zodat het if of else blok eerst wordt geplaatst, afhankelijk van welk blok vaker waar is.

  • Dead Code Separation - Profielgestuurde optimalisatie verplaatst code die tijdens het profileren niet wordt aangeroepen naar een speciale sectie aan het einde van de verzameling secties. Het houdt deze sectie effectief buiten de vaak gebruikte pagina's.

  • EH-codescheiding : omdat EH-code alleen uitzonderlijk wordt uitgevoerd, kan deze vaak worden verplaatst naar een afzonderlijke sectie. Met profielgestuurde optimalisaties worden deze verplaatst wanneer ze bepalen dat de uitzonderingen zich alleen voordoen in uitzonderlijke omstandigheden.

  • Geheugen intrinsiek: of u een intrinsiek wilt uitbreiden of niet, is afhankelijk van of deze vaak wordt aangeroepen. Een intrinsiek kenmerk kan ook worden geoptimaliseerd op basis van de blokgrootte van bewegingen of kopieën.

Volgende stappen

Zie de volgende bronnen voor meer informatie over deze omgevingsvariabelen, functies en hulpprogramma's die u kunt gebruiken in profielgestuurde optimalisaties:

Omgevingsvariabelen voor profielgestuurde optimalisaties
Deze variabelen geven het runtimegedrag van testscenario's op. Ze zijn nu afgeschaft en vervangen door nieuwe linkeropties. In dit document ziet u hoe u van de omgevingsvariabelen naar de linkeropties gaat.

PgoAutoSweep
Een functie die u aan uw app kunt toevoegen om gedetailleerde .pgc controle over het vastleggen van bestandsgegevens te bieden.

pgosweep
Een opdrachtregelprogramma waarmee alle profielgegevens naar het .pgc bestand worden geschreven, het .pgc bestand wordt gesloten en een nieuw .pgc bestand wordt geopend.

pgomgr
Een opdrachtregelprogramma waarmee profielgegevens uit een of meer .pgc bestanden aan het .pgd bestand worden toegevoegd.

Procedure: meerdere PGO-profielen samenvoegen in één profiel
Voorbeelden van pgomgr-gebruik .

Voorbeeldzelfstudie voor Profile-Guided Optimization (SPGO)
Gebruik prestatiemeteritems voor CPU-hardware in plaats van instrumentatie. Er is geen instrumented build vereist- profileer uw bestaande release-binair met xperf.

Zie ook

Aanvullende MSVC-buildtools