Optimalizace na základě profilu
Optimalizace s asistencí profilu (PGO) umožňuje optimalizovat celý spustitelný soubor, kde 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í.
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.
Každý modul sestavený pomocí /GL je možné prozkoumat během běhů testů optimalizace s asistencí profilu a zachytit chování za běhu. Každý modul v sestavení optimalizace s asistencí profilu nemusí být kompilován pomocí /GL. Pouze tyto 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, vytvoří se
.pgd
při spuštění instrumentované aplikace 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). Při zadávání parametru /GENPROFILE můžete volitelně přidat argument PGD=název_souboru , který určuje jiný název nebo umístění souboru.pgd
. Kombinace možností linkeru /LTCG a /GENPROFILE nebo /FASTGENPROFILE nahrazuje zastaralou možnost linkeru /LTCG:PGINSTRUMENT .Profilování aplikace.
Při každém ukončení profilované relace EXE nebo se uvolní profilovaná knihovna DLL,
appname!N.pgc
vytvoří se soubor..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, které se zvýší na základě počtu dalšíchappname!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 zachytila data profilu v okamžiku volání jako
.pgc
soubor. Může vám poskytnout jemně 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 se provede jako vstup do
.pgd
souboru. Pokud zadáte parametr /USEPROFILE, můžete volitelně přidat argument PGD=název souboru a zadat pro soubor jiný než výchozí název nebo umístění.pgd
. Tento název můžete také zadat pomocí zastaralé možnosti linkeru /PGD . Kombinace /LTCG a /USEPROFILE nahrazuje zastaralé možnosti linkeru /LTCG:PGOPTIMIZE a /LTCG:PGUPDATE .
Je dokonce možné vytvořit optimalizovaný spustitelný soubor a později určit, že další profilace by byla užitečná k vytvoření optimalizovanější image. Pokud je k dispozici instrumentovaná image a její .pgd
soubor, můžete provést další testovací 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 jsou uloženy v systému správy zdrojového kódu, vyhněte se automatické transformaci, která může být provedena v textových souborech.
Optimalizace prováděné PGO
Optimalizace s asistencí profilu zahrnují tyto kontroly a vylepšení:
Inlining – například pokud je funkce A často volá funkci B a funkce B relativně malá, pak optimalizace na základě profilu inline funkce B ve funkci A.
Spekulace virtuálních volání – Pokud virtuální volání nebo jiné volání prostřednictvím ukazatele funkce často cílí na určitou funkci, může optimalizace s asistencí profilu vložit podmíněně spuštěné přímé volání do často cílené funkce a 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ě spouštěné základní bloky, které se časově provádějí v daném rámci, aby se umístily 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.
Rozložení funkce – na základě grafu volání a profilovaného chování volajícího nebo volané funkce, které mají tendenci být podél stejné cesty provádění, jsou umístěny ve stejné části.
Podmíněná optimalizace větví – pomocí sond hodnot můžou 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. Totéž lze provést s
if
...else
pokyny, kde optimalizátor může objednatif
...else
tak, aby buďif
blok neboelse
blok je umístěn jako první, v závislosti na tom, který blok je častěji true.Oddělení mrtvého kódu – kód, který se během profilace nevolá, se přesune do speciálního oddílu, který se připojí na konec sady oddílů. Efektivně udržuje tento oddíl mimo často používané stránky.
Oddělení kódu EH – protože kód EH je pouze výjimečně proveden, lze jej často přesunout do samostatného oddílu. Přesune se, když optimalizace s asistencí profilu můžou určit, že k výjimkám dochází pouze za výjimečných podmínek.
Vnitřní funkce paměti – určuje, 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
Přečtěte si 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:
Proměnné prostředí pro optimalizace řízené profilem
Tyto proměnné se použily k určení 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 jemně odstupňované .pgc
řízení zachytávání 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 .pgd
souboru přidá data profilu z jednoho nebo více .pgc
souborů.
Postupy: Sloučení více profilů PGO do jednoho profilu
Příklady použití pgomgr