Optimalizace na základě profilu

Optimalizace s asistencí profilu (PGO) umožňuje optimalizovat celý spustitelný soubor. Optimalizátor používá data z testovacích spuštění .exe nebo .dll souboru. Data představují pravděpodobný výkon programu v produkčním prostředí.

Poznámka:

SPGO (optimalizace řízená vzorkovaným profilem) je alternativní přístup, který místo instrumentace využívá hardwarové čítače výkonu procesoru ve Windows. SPGO nevyžaduje žádné instrumentované sestavení – profilujete existující binární soubor verze pomocí xperf. Další informace najdete v článcích Představení technologie Sample Profile Guided Optimization v MSVC a kurz k technologii Sample Profile-Guided Optimization (SPGO).

Optimalizace na základě profilu jsou dostupné jenom pro nativní cíle x86, x64 nebo ARM64. Optimalizace řízené profilem nejsou k dispozici pro spustitelné soubory, které běží v modulu CLR (Common Language Runtime). I když vytvoříte sestavení se smíšeným nativním a spravovaným kódem (pomocí možnosti kompilátoru /clr ), nemůžete použít optimalizaci s asistencí profilu pouze u nativního kódu. Pokud se pokusíte vytvořit projekt s těmito možnostmi nastavenými v integrovaném vývojovém prostředí (IDE), dojde k chybě sestavení.

Poznámka:

Informace shromážděné z profilace testovacích běhů přepisují optimalizace, které by jinak byly účinné, pokud zadáte /Ob, /Os nebo /Ot. Další informace najdete v tématu /Ob (rozšíření vložené funkce) a /Os, /Ot (upřednostnění malého kódu, upřednostnění rychlého kódu).

Postup optimalizace aplikace

Pokud chcete použít optimalizaci s asistencí profilu, postupujte podle těchto kroků a optimalizujte aplikaci:

  • Zkompilujte jeden nebo více souborů zdrojového kódu pomocí /GL.

    Kompilátor zkoumá jednotlivé moduly vytvořené pomocí /GL během běhů testů optimalizace s asistencí profilu za účelem zachycení chování za běhu. Nemusíte kompilovat každý modul v sestavení s optimalizací řízenou profilem pomocí /GL. Pouze moduly kompilované pomocí /GL jsou však instrumentovány a později k dispozici pro optimalizace s asistencí profilu.

  • Propojení pomocí /LTCG a /GENPROFILE nebo /FASTGENPROFILE.

    Když použijete /LTCG i /GENPROFILE nebo /FASTGENPROFILE, instrumentovaná aplikace při spuštění vytvoří .pgd soubor. Po přidání dat testovacího spuštění do .pgd souboru je možné je použít jako vstup do dalšího kroku odkazu (vytvoření optimalizované image). Pokud zadáte parametr /GENPROFILE, můžete volitelně přidat argument PGD=název souboru , který určuje nedefaultní název nebo umístění .pgd souboru. Kombinace možností linkeru /LTCG a /GENPROFILE nebo /FASTGENPROFILE nahrazuje zastaralou možnost linkeru /LTCG:PGINSTRUMENT .

  • Profilování aplikace.

    Pokaždé, když profilovaná relace EXE skončí nebo se profilovaná knihovna DLL uvolní z paměti, proces vytvoří soubor appname!N.pgc. .pgc Soubor obsahuje informace o konkrétním testovacím spuštění aplikace. název aplikace je název vaší aplikace a N je číslo začínající číslem 1. Zvýší se na základě počtu dalších appname!N.pgc souborů v adresáři. Pokud testovací běh nepředstavuje scénář, který chcete optimalizovat, můžete odstranit .pgc soubor.

    Během testovacího spuštění můžete vynutit uzavření aktuálně otevřeného .pgc souboru a vytvoření nového .pgc souboru pomocí nástroje pgosweep (například když konec testovacího scénáře neodpovídá vypnutí aplikace).

    Vaše aplikace může také přímo vyvolat funkci PGO, PgoAutoSweep, aby při volání zachytila data profilu jako soubor . Může vám poskytnout jemnější kontrolu nad kódem pokrytým zachycenými daty ve vašich .pgc souborech. Příklad použití této funkce najdete v dokumentaci k PgoAutoSweep .

    Při vytváření instrumentovaného sestavení se ve výchozím nastavení shromažďování dat provádí v nouzovém režimu bez vláken, což je rychlejší, ale může být nepřesné. Pomocí argumentu EXACT pro /GENPROFILE nebo /FASTGENPROFILE můžete určit shromažďování dat v nouzovém režimu vlákna, což je přesnější, ale pomalejší. Tato možnost je dostupná také v případě, že při vytváření instrumentovaného sestavení nastavíte zastaralou proměnnou prostředí PogoSafeMode nebo zastaralou možnost linkeru /POGOSAFEMODE .

  • Propojení pomocí /LTCG a /USEPROFILE

    K vytvoření optimalizované image použijte jak možnosti linkeru /LTCG , tak /USEPROFILE . Tento krok používá soubor .pgd jako vstup. Pokud zadáte parametr /USEPROFILE, můžete volitelně přidat argument PGD=název_souboru , který určuje nedefaultní název nebo umístění .pgd souboru. Tento název můžete také zadat pomocí zastaralé volby linkeru /PGD. Kombinace možností linkeru /LTCG a /USEPROFILE nahrazuje zastaralé možnosti /LTCG:PGOPTIMIZE a /LTCG:PGUPDATE linker.

Je dokonce možné vytvořit optimalizovaný spustitelný soubor a později zjistit, že by bylo užitečné provést další profilování, aby bylo možné vytvořit ještě optimalizovanější bitovou kopii. Pokud je k dispozici instrumentovaná image a její .pgd soubor, můžete provést více testovacích spuštění a znovu sestavit optimalizovanou image s novějším .pgd souborem pomocí stejných možností linkeru /LTCG a /USEPROFILE .

Poznámka:

Oba .pgc soubory .pgd jsou binární typy souborů. Pokud je uložíte do systému správy zdrojového kódu, vyhněte se automatickým transformacím, které by mohly být provedeny v textových souborech.

Optimalizace prováděné PGO

Optimalizace s asistencí profilu zahrnují tyto kontroly a vylepšení:

  • Inlining – například pokud funkce A často volá funkci B a funkce B je relativně malá, optimalizace řízené profilem vloží funkci B přímo do funkce A.

  • Spekulace virtuálních volání – Pokud virtuální volání nebo jiné volání přes ukazatel funkce často cílí na určitou funkci, může optimalizace s asistencí profilu vložit podmíněně prováděné přímé volání do často cílené funkce a toto přímé volání může být vloženo.

  • Přidělení registru – Optimalizace založená na datech profilu vede k lepšímu přidělení registru.

  • Optimalizace základního bloku – Optimalizace základního bloku umožňuje běžně využívané základní bloky, které se vykonávají během stejného časového intervalu, umístit do stejné sady stránek (lokalita). Minimalizuje počet použitých stránek, což minimalizuje režijní náklady na paměť.

  • Optimalizace velikosti/rychlosti – funkce, ve kterých program tráví nejvíce času provádění, je možné optimalizovat pro rychlost.

  • Rozvržení funkcí – Na základě volacího grafu a profilovaného chování volajícího a volaného se funkce, které mají tendenci být na stejné spouštěcí trase, umisťují do stejné části.

  • Podmíněná optimalizace větvení – pomocí sond hodnot mohou optimalizace s asistencí profilu zjistit, jestli se daná hodnota v příkazu switch používá častěji než jiné hodnoty. Tuto hodnotu lze pak z příkazu switch odstranit. Stejnou optimalizaci lze provést pomocí instrukcí if...else, kde optimalizátor může uspořádat if...else tak, aby byl nejprve umístěn blok if nebo else v závislosti na tom, který z nich je častěji vyhodnocen jako pravdivý.

  • Oddělení mrtvého kódu – Optimalizace řízená profilem přesune kód, který není během profilování volán, do speciální sekce na konci sady sekcí. Efektivně zamezuje zařazení této sekce mezi často používané stránky.

  • Oddělení kódu EH – protože se kód EH vykonává pouze výjimečně, lze jej často přesunout do samostatné části. Optimalizace řízené profilem jej přesunou, pokud určí, že k výjimkám dochází pouze ve výjimečných situacích.

  • Vnitřní funkce paměti – jestli se má vnitřní objekt rozšířit nebo ne, závisí na tom, jestli se často volá. Vnitřní objekt lze optimalizovat také na základě velikosti bloku operací přesunutí nebo kopírování.

Další kroky

Další informace o těchto proměnných prostředí, funkcích a nástrojích, které můžete použít v optimalizacích s asistencí profilu, najdete v následujících zdrojích informací:

Proměnné prostředí pro optimalizace řízené profilem
Tyto proměnné určují chování testovacích scénářů za běhu. Jsou teď zastaralé a nahrazené novými možnostmi linkeru. Tento dokument ukazuje, jak přejít z proměnných prostředí na možnosti linkeru.

PgoAutoSweep
Do aplikace můžete přidat funkci, která poskytuje precizní .pgc kontrolu nad zachytáváním dat souborů.

pgosweep
Nástroj příkazového řádku, který zapíše všechna data profilu do .pgc souboru, zavře .pgc soubor a otevře nový .pgc soubor.

pgomgr
Nástroj příkazového řádku, který do .pgc souboru přidá data profilu z jednoho nebo více .pgd souborů.

Postupy: Sloučení více profilů PGO do jednoho profilu
Příklady použití pgomgr

Ukázkový návod k optimalizaci řízené profilem (SPGO)
Místo instrumentace používejte čítače výkonu hardwaru procesoru. Nevyžaduje se žádné instrumentované sestavení – profilujte stávající binární soubor verze pomocí xperf.

Viz také

Další nástroje sestavení MSVC