Sdílet prostřednictvím


Doporučené postupy pro optimalizaci

Tento dokument popisuje některé doporučené postupy pro optimalizaci v jazyce C++.Následující témata:

  • Kompilátor a možnosti Linker

    • Optimalizace s asistencí profilu

    • Použít úroveň optimalizace

    • Plovoucí bod přepínače

  • Optimalizace Declspecs

  • Optimalizace Pragmas

  • __restrict a __assume

  • Vnitřní podpora

  • Výjimky

Kompilátor a možnosti Linker

ms235601.collapse_all(cs-cz,VS.110).gifOptimalizace s asistencí profilu

Visual C++ podporuje optimalizace s asistencí profilu (PGO).Jednotka vyšší optimalizace aplikace pomocí této optimalizace profilu data z minulosti zjišťování získávaná verze aplikace.Pomocí PGO může být časově náročné, takže něco, který používá každý vývojář nemusí být ale doporučujeme použití PGO pro sestavení konečné verze produktu.Další informace naleznete v tématu Optimalizace s asistencí profilu.

Kromě optimalizace celého programu (také zná jako odkaz, čas generování kódu) a /O1 a /O2 optimalizace zlepšila.Aplikace zkompilována jednu z těchto možností bude obecně rychlejší než stejné aplikace zkompilována starší kompilátoru.

Další informace naleznete v tématu /GL (celý Program optimalizace) a / O1, /O2 (velikost minimalizovat, maximalizovat rychlost).

ms235601.collapse_all(cs-cz,VS.110).gifPoužít úroveň optimalizace

Pokud je to možné je třeba sestavit konečné verze sestavení s asistencí optimalizace profilu.Pokud není možné sestavit s PGO, zda kvůli nedostatečné infrastruktury pro spuštění instrumentovaného sestavení nebo nemají přístup ke scénářům, doporučujeme budovy optimalizace celý Program.

/Gy Přepínač je velmi užitečné.Generuje samostatné COMDAT pro každou funkci poskytující vytvořeném propojovacím větší flexibilitu při odebírání, na které neexistuje odkaz COMDATs a COMDAT skládání.Jedinou nevýhodou použití /Gy je, že může mít menší vliv na sestavení.Proto je obecně vhodné jej používat.Další informace naleznete v tématu /Gy (Povolit funkce úrovně propojení).

Propojení v 64bitové prostředí, je doporučeno používat /OPT:REF,ICF linker možnost a 32bitové prostředí /OPT:REF je doporučeno.Další informace naleznete v tématu / OPT (optimalizace).

Je také doporučeno generovat ladicí symboly i s optimalizovanou verzi sestavení.Ji nebude platit generovaný kód a umožňuje mnoho snadnější ladění aplikace, pokud je třeba být.

ms235601.collapse_all(cs-cz,VS.110).gifPlovoucí bod přepínače

/Op Byla odebrána možnost kompilátoru a byly přidány následující čtyři možnosti kompilátoru se zabývají plovoucí bod optimalizace:

/fp:precise

Toto je výchozí doporučení a ve většině případů by použit.

/fp:fast

Doporučeno, pokud výkon je nanejvýš důležité, například ve hrách.Výsledkem bude nejrychlejší výkon.

/fp:strict

Pokud doporučené přesné výjimky s plovoucí desetinnou čárkou a IEEE je žádoucí chování.Výsledkem bude nejpomalejší výkon.

/fp:except[-]

Lze použít ve spojení s /fp:strict nebo /fp:precise, ale není /fp:fast.

Další informace naleznete v tématu /FP (určit chování s plovoucí čárkou).

Optimalizace Declspecs

V této části se podíváme na dva declspecs, které lze použít v programech pomoci výkon: __declspec(restrict) a __declspec(noalias).

restrict Declspec lze použít pouze deklarace funkce, které vrací ukazatel, například__declspec(restrict) void *malloc(size_t size);

restrict Declspec se používá funkce, které vracejí ukazatelů kapitoly.Toto klíčové slovo se používá pro provádění C Runtime knihovny malloc od nikdy vrátí ukazatel hodnotu, která je již používán v aktuálním programu (Pokud byste něco nelegální například poté, co byla uvolnena pomocí paměti).

restrict Declspec poskytuje kompilátor Další informace pro provádění optimalizace kompilátoru.Jeden nejtěžší věci pro kompilátor určit je alias jaké ukazatele ostatní ukazatele a pomocí těchto informací významně pomůže kompilátoru.

Je vhodné směřující je promise kompilátoru není něco kompilátor bude ověřovat.Pokud program používá tento restrict declspec nevhodně, program pravděpodobně nesprávné chování.

Další informace naleznete v tématu restrict.

noalias Declspec je také použito pouze na funkce a označuje, že funkce je funkce semi-pure.Funkce semi-pure je odkaz nebo upravuje pouze locals argumenty a indirections první úrovně argumentů.Tento declspec je promise kompilátoru, pokud funkce odkazuje globals nebo druhé úrovně indirections ukazatel argumenty potom kompilátor může generovat kód, konce a aplikace.

Další informace naleznete v tématu noalias.

Optimalizace Pragmas

Existuje také několik užitečných pragmas vám pomohou optimalizovat kód.Zaměříme je první #pragma optimize:

#pragma optimize("{opt-list}", on | off)

Toto záhlaví pragma umožňuje nastavit úroveň dané optimalizace na základě funkce pomocí funkce.Toto je ideální pro těchto výjimečných kde zhroucení aplikace při dané funkce je dodržováno optimalizace.Pomocí této vypnout optimalizace pro jedinou funkci:

#pragma optimize("", off)
int myFunc() {...}
#pragma optimize("", on)

Další informace naleznete v tématu optimize.

Inlining je jedním z nejdůležitějších optimalizace, které provádí kompilátor a zde můžeme hovořit o několika pragmas, který toto chování změnit.

#pragma inline_recursionje užitečné pro určení, zda chcete, aby aplikace moci vložené rekurzivní volání.Ve výchozím nastavení je vypnuto.Nedávná rekurze malé funkce můžete zapnout.Další informace naleznete v tématu inline_recursion.

Jiné užitečné pragma omezit hloubku inlining je #pragma inline_depth.Toto je obvykle vhodná v situacích, kdy chcete omezit velikost program nebo funkce.Další informace naleznete v tématu inline_depth.

__restrict a __assume

Existuje několik klíčových slov jazyka Visual C++, které pomohou výkon: __restrict a __assume.

Nejprve je třeba poznamenat, že __restrict a __declspec(restrict) jsou dvě různé věci.Zatímco poněkud související, jejich sémantiku jsou různé.__restricttyp kvalifikátoru, jako je const nebo volatile, ale výhradně pro typy ukazatele.

Ukazatel, který je upraven s __restrict se označuje jako __restrict ukazatel.__Restrict ukazatel je ukazatel, který lze přistupovat pouze prostřednictvím __restrict ukazatel.Jinými slovy jiný ukazatel nelze použít pro přístup k datům odkazuje __restrict ukazatel.

__restrictmůže být výkonný nástroj pro optimalizaci Visual C++, ale použít velmi pečlivě.Pokud nesprávně, optimalizátor provádět optimalizace, která by poškození aplikace.

__restrict Nahradí klíčové slovo /Oa přepnout z předchozí verze.

S __assume, vývojář, můžete zjistit kompilátoru, aby předpoklady o hodnotu některé proměnné.

Například __assume(a < 5); říká Optimalizátor, na řádek kódu proměnná a je menší než 5.Opět je promise kompilátoru.Pokud a je skutečně 6 v tomto okamžiku v programu pak chování programu po byl optimalizován kompilátor nemusí být co byste očekávali.__assumeje nejvhodnější pro před příkazy switch a podmíněné výrazy.

Existují určitá omezení na __assume.Jako první, __restrict, je pouze návrh, tak je kompilátor zdarma je ignorovat.Také __assume nyní pracuje pouze s proměnnou nerovností proti konstanty.Nejsou rozšířena symbolické nerovností, například assume(a <. b).

Vnitřní podpora

Vnitřní objekty serveru jsou funkce volá kde kompilátor má vnitřní znalosti o volání a nikoli voláním funkce v knihovně, je kód funkce vyzařuje.Intrin.h soubor záhlaví umístěné na <Installation_Directory> \VC\include\intrin.h obsahuje všechny dostupné vnitřní objekty serveru pro všechny tři podporované platformy (x 86, x 64 a Itanium).

Vnitřní objekty serveru umožňují programátor přejít hluboko do kódu bez nutnosti použití sestavení.Existuje několik výhod použití vnitřní objekty serveru:

  1. Kód je obecnější.Několik vnitřní objekty serveru jsou k dispozici na více architekturách procesoru.

  2. Kód je snadněji číst, protože kód je stále napsáno v C/C++.

  3. Kód získá výhody optimalizace kompilátoru.Jako kompilátor získává lepší, zlepšuje generování kódu pro vnitřní objekty serveru.

Další informace naleznete v tématu Vnitřní objekty serveru kompilátoru a Výhody použití vnitřní objekty serveru.

Výjimky

Je výkonu přístupů spojených s pomocí výjimky.Některá omezení jsou zavedeny při použití zkuste bloků, které inhibují kompilátor z provádění určitých optimalizace.Platformy, který je snížení výkonu další z řady x 86 zkuste bloky kvůli státu Další informace, které musí být generováno během spuštění kódu.Na 64bitových platformách, zkuste bloků není snížit výkon tolik, ale jakmile je vyvolána výjimka, proces hledání obslužnou rutinu a příkazem zásobníku může být nákladné.

Doporučujeme proto, aby se bloků try/catch do kódu, který nemusí ve skutečnosti je.Pokud je nutné použít výjimky, pokud možno použijte synchronní výjimky.Další informace naleznete v tématu Structured Exception zpracování (C++).

Konečně vyvoláním výjimky pro jen výjimečně.Použití výjimky pro obecné řízení toku pravděpodobně způsobí zhoršení výkonu.

Viz také

Koncepty

Optimalizace kódu