Optimalizace na základě profilu
Optimalizace na základě profilu umožňuje optimalizovat výstupní soubor, kde optimalizátor používá data testovacích běhů souboru .exe nebo .dll.Data představují pravděpodobný výkon programu ve výrobním prostředí.
Optimalizace na základě profilu jsou dostupné pouze pro nativní cíle x86 nebo x64.Optimalizace na základě profilu nejsou dostupné pro výstupní soubory, které budou spuštěny v modulu CLR.Ani v případě, že vytvoříte sestavení se smíšeným nativním a spravovaným kódem (kompilace s možností /clr), nelze optimalizace na základě profilu použít ani pouze pro nativní kód.Pokusíte-li se sestavit projekt s těmito možnostmi nastavenými v prostředí IDE, dojde k chybě sestavení.
[!POZNÁMKA]
Informace shromážděné z testovacích běhů profilování přepíší optimalizace, které by byly jinak aktivní v případě zadání možnosti /Ob, /Os nebo /Ot.Další informace naleznete v tématu /Ob (rozbalení vložené funkce) a /Os, /Ot (Upřednostnit malý kód, upřednostnit rychlý kód).
Následuje přehled procesu použití optimalizací na základě profilu:
Kompilace jednoho nebo více souborů zdrojového kódu s možností /GL.
Všechny moduly sestavené s možností /GL budou během testovacích běhů optimalizace na základě profilu přezkoumány a bude zachyceno jejich chování za běhu.Ne všechny moduly v sestavení optimalizace na základě profilu musí být zkompilovány s možností /GL.Avšak pouze moduly zkompilované s možností /GL budou instrumentovány a později dostupné pro optimalizace na základě profilu.
Propojení s možností /LTCG:PGINSTRUMENT.
Možnost /LTCG:PGINSTRUMENT vytvoří prázdný soubor .pgd.Po testovacím běhu jsou do souboru .pgd přidána data a lze jej použít jako vstup pro další krok propojování (vytvoření optimalizované bitové kopie).Při zadávání možnosti /LTCG:PGINSTRUMENT lze volitelně zadat možnost /PGD s jiným názvem nebo umístěním pro soubor .pgd.
Profilování aplikace.
Pokaždé, kdy skončí profilovaná relace EXE nebo je uvolněna profilovaná knihovna DLL, je vytvořen soubor název_aplikace!#.pgc.Soubor .pgc obsahuje informace o konkrétním testovacím běhu aplikace. # je číslo od 1, které se zvyšuje podle počtu jiných souborů název_aplikace!#.pgc v adresáři.Nepředstavuje-li testovací běh scénář, který má být optimalizován, lze soubor .pgc odstranit.
Během testovacího běhu lze vynutit uzavření aktuálně otevřeného souboru .pgc a vytvoření nového souboru .pgc pomocí nástroje pgosweep (pokud například testovací scénář nekončí spolu s aplikací).
Při profilování aplikace lze použít možnost PogoSafeMode.Tato možnost umožňuje zadat, zda chcete profilovat aplikaci v bezpečném nebo rychlém režimu.Další informace o těchto režimech naleznete v tématu PogoSafeMode.
Propojení s možností /LTCG:PGOPTIMIZE.
Možnost /LTCG:PGOPTIMIZE vytvoří optimalizovanou bitovou kopii.Vstupem pro tento krok je soubor .pgd.Další informace naleznete v tématu /LTCG:PGOPTIMIZE.
Lze dokonce vytvořit optimalizovaný výstupní soubor a později určit, že pro více optimalizovanou bitovou kopii by bylo užitečné další profilování.Je-li instrumentovaná bitová kopie a její soubor .pgd k dispozici, lze provést dodatečné testovací běhy a optimalizovanou bitovou kopii znovu sestavit s novým souborem .pgd.
Následuje seznam optimalizací na základě profilu:
Vkládání – Pokud například existuje funkce A, která často volá funkci B a je-li funkce B relativně malá, optimalizace na základě profilu vloží funkci B do funkce A.
Spekulace o virtuálních voláních – Pokud virtuální volání nebo jiné volání pomocí ukazatele na funkci často cílí na určitou funkci, optimalizace na základě profilu může vložit podmíněně spouštěné přímé volání často cílené funkce.
Přidělení registru – Optimalizace s daty profilu mají za následek lepší přidělování registru.
Optimalizace základních bloků – Optimalizace základních bloků umožňuje umístění běžně spouštěných základních bloků, které jsou dočasně spouštěny uvnitř daného rámce, do stejné sady stránek (umístění).Tím je minimalizován počet použitých stránek, a tedy i režie paměti.
Optimalizace velikosti/rychlosti – Funkce, kde program stráví mnoho času, lze optimalizovat pro rychlost.
Rozložení funkcí – Na základě grafu volání a profilovaného chování volajícího/volaného jsou funkce, které bývají na stejné cestě spouštění, umístěny do stejného oddílu.
Optimalizace podmíněných větví – Optimalizace na základě profilu mohou pomocí sond hodnot zjistit, zda je daná hodnota v příkazu switch používána častěji než jiné hodnoty. Tuto hodnotu lze pak z příkazu switch odstranit. Totéž lze provést s instrukcemi if/else, kde optimalizátor může příkaz if/else uspořádat tak, že je jako první umístěn blok if nebo else v závislosti na tom, který z nich je častěji vyhodnocen na hodnotu true.
Oddělení mrtvého kódu – Kód, který během profilování nebyl zavolán, je přemístěn do zvláštního oddílu připojeného ke konci sady oddílů.Tím je tento oddíl efektivně udržován mimo často používané stránky.
Oddělení kódu EH– Kód EH, který je spouštěn jen výjimečně, lze často přesunout do odděleného oddílu ve chvíli, kdy optimalizace na základě profilu mohou určit, že k výjimkám dochází jen za výjimečných podmínek.
Vnitřní objekty paměti – O rozšíření vnitřních objektů se lze lépe rozhodnout, lze-li určit, zda jsou volány často.Vnitřní objekt lze optimalizovat také na základě velikosti bloku operací přesunutí nebo kopírování.
Další informace naleznete v tématu Walkthrough: Using Profile-Guided Optimizations.
V této části
Nástroje pro optimalizace na základě profilu
Postupy: Sloučení několika profilů PGO do jediného profilu