Optimalizace Kódu
- Definice a Vlastnosti
- Typy a Úrovně Optimalizace
- Co Optimalizovat
- Dobré a Špatné Výsledky Optimalizace
- Závěr
- PVS-Studio
Obsah
Definice a Vlastnosti
optimalizace Kódu je nějaký způsob modifikace kódu zlepšit kvalitu kódu a účinnosti. Program může být optimalizován tak, že se stává menší velikost, spotřebovává méně paměti, provádí rychleji, nebo provádí méně vstupních / výstupních operací.
základní požadavky optimalizace metody by měly splňovat, je, že optimalizovaný program musí mít stejný výstup a vedlejší účinky jako jeho non-optimalizované verze. Tento požadavek však může být ignorován v případě, že přínos z optimalizace je odhadován jako důležitější než pravděpodobné důsledky změny chování programu.
typy a úrovně optimalizace
optimalizace mohou být prováděny automatickými optimalizátory nebo programátory. Optimalizátor je buď specializovaný softwarový nástroj, nebo vestavěná jednotka kompilátoru (tzv. Moderní procesory mohou také optimalizovat pořadí provádění kódových instrukcí.
optimalizace se dělí na optimalizace na vysoké a nízké úrovni. Optimalizace na vysoké úrovni obvykle provádí programátor, který zpracovává abstraktní entity (funkce, postupy, třídy atd.) a má na paměti obecný rámec úkolu optimalizovat návrh systému. Optimalizace prováděné na úrovni elementárních konstrukčních bloků zdrojového kódu-smyčky, větve atd. – jsou obvykle označovány jako optimalizace na vysoké úrovni, zatímco někteří autoři je klasifikují do samostatné (“střední”) úrovně (N. Wirth?). Nízkoúrovňové optimalizace se provádějí ve fázi, kdy je zdrojový kód sestaven do sady strojových instrukcí, a v této fázi se obvykle používá automatizovaná optimalizace. Assembler programátoři se domnívají, nicméně, že žádný stroj však dokonalý, nemůže udělat lépe, než zkušený programátor (zatím všichni souhlasí s tím, že chudák programátor bude dělat mnohem horší věci než počítač).
Co Optimalizovat
S ruční optimalizace kódu, jeden čelí další problém: není jen je třeba vědět, jak přesně optimalizace by mělo být provedeno, ale také to, co konkrétní část programu by měla být optimalizovaná. Z různých důvodů (pomalý vstupní operace, rozdíl v pracovní rychlost lidského operátora a počítače, a tak dále), 90% doba realizace programu je strávil vykonávající pouze 10% kódu (toto tvrzení je spíše spekulativní, s Paretův princip jako docela pochybné zemi, ale A. Tanenbaum dělá to znít přesvědčivě). Od optimalizace trvá další čas kromě času jste strávili na vývoji programu, raději se zaměří na optimalizaci této době-kritické 10% kódu, spíše než se snažit optimalizovat celý program. Tyto fragmenty kódu jsou známé jako překážky, a mohou být detekovány pomocí speciálních utilit – analytiky -, které mohou měřit čas v různých částech programu provést.
V praxi, nicméně, optimalizace se obvykle provádí po fázi “chaotické” programování (včetně takových metod jako “Kopírovat-Vložit”, “uvidíme se později”, “to je v POŘÁDKU takhle”), a proto je směs optimalizace jako takové, refactoring a opravy chyb: zjednodušení “queer” konstrukty, jako je strlen(cestu.c_str ()), logické podmínky jako (a. x != 0 && a. x != 0) a tak dále. Profilery jsou málo pomoci s tímto druhem optimalizace. Tyto problémy však můžete zjistit pomocí nástrojů statické analýzy, tj. nástroje určené k vyhledávání sémantických chyb, spoléhající se na hlubokou analýzu zdrojového kódu. Jak můžete vidět z výše uvedeného příkladu s podivným stavu, neefektivní kód se může objevit v důsledku chyby (jako překlep v našem příkladu, kde.x != 0 && a. y != 0 by mělo být místo). Výkonný statický analyzátor detekuje takové fragmenty kódu a upozorní na ně vytvářením varovných zpráv.
dobré a špatné výsledky optimalizace
v programování by se téměř vše mělo zacházet z hlediska racionality-optimalizace není výjimkou . Existuje přesvědčení, že kód napsaný nezkušeným programátorem assembleru je 3-5krát pomalejší než kód generovaný kompilátorem (Zubkov). Široce známá je fráze Knuth ohledně předčasného low-level optimalizace (například pokusy ušetřit na provozovatele nebo proměnné): “Předčasná optimalizace je kořenem všeho zla”.
většina programátorů si nestěžuje na optimalizace prováděné optimalizátorem, z nichž některé jsou konvenční a povinné. Například optimalizace tail volání ve funkčních jazycích (tail volání je speciální případ rekurze, která může být reprezentována jako smyčka).
je však třeba si uvědomit, že více složitých optimalizací na úrovni strojového kódu může způsobit velké zpomalení kompilace. Výhoda, kterou vám umožní získat, může být ve srovnání s obecnými optimalizacemi návrhu systému (Wirth) příliš nevýznamná. Jeden by měl také mít na paměti, že moderní jazyky, se všemi jejich syntaktické a sémantické “kudrlinky”, má mnoho nuance a nuance, tak, že programátor, který není obeznámen s nimi může být překvapen tím, že výsledek optimalizace.
Vezměte například C++ a takzvanou optimalizaci návratové hodnoty, když kompilátor zabrání kopírování dočasného objektu vráceného funkcí. Protože kompilátor vynechává kopírování, nazývá se tato metoda také”kopírování”. Takže následující kód:
#include <iostream> struct C { C() {} C(const C&) { std::cout << "A copy was made.\n"; }}; C f() { return C();} int main() { std::cout << "Hello World!\n"; C obj = f();}
může mít několik výstupů:
Hello World!A copy was made.A copy was made.Hello World!A copy was made.Hello World!
může se to zdát Divné, všechny tři verze jsou platné, protože jazyk, norma umožňuje vynechání volá kopírovací konstruktor v takových případech, i když konstruktor má vedlejší účinky (§12.8 Kopírování Třídy Objektů, Bod 15).
Závěr
Proto bychom měli vždy zvážit optimalizaci programového kódu pomocí specializovaných utilit, kdekoli je to možné, ale dělat to s velkou péčí, a být připraveni na pravděpodobnost nečekané triky z kompilátoru.
PVS-Studio
ve statickém analyzátoru PVS-Studio je implementována sada diagnostik, která vám umožní najít některé situace, kdy lze kód optimalizovat. PVS-Studio jako jakýkoli jiný statický analyzátor však nemůže sloužit jako náhrada profilovacích nástrojů. Pouze dynamické programové analyzátory jsou schopny identifikovat úzká místa. Statické analyzátory nevědí, jaké vstupní datové programy získají a jak často se provádí určitý kus kódu. Proto říkáme, že analyzátor navrhuje implementovat některé “mikrooptimalizace” kódu, které nezaručují zvýšení výkonu.
navzdory zvažované nevýhodě působí PVS-Studio analyzer jako dobrý doplněk k profilovacím nástrojům. Navíc, když se jedná o varování PVS-Studio, související s optimalizací, kód se často stává jednodušším a kratším. Tento efekt je podrobněji popsán v článku “zkoumání Mikrooptimizací pomocí kódu Tizen jako příkladu”.