Začátečník

Pokročilý

Profesionál

Optimalizace /1. díl

Cíl: Rychlejší a efektivnější programový kód

 

Budete potřebovat přibližně 1 hodinu

Operační systém použitý v příspěvku: Windows 2000

Vývojové nástroje: Visual Basic 6.0

 

 

Vítejte.

 

Z vlastní zkušenosti vím, že jednou se každý programátor dostane do situace, kdy nebude zcela spokojen s výkonem a rychlostí běhu vyvíjené aplikace. Pokud bych měl být ještě více realističtější, řekl bych, že právě myšlenky, jak zlepšit a zrychlit tu, nebo jinou část aplikace, se stávají zakrátko noční můrou programátora. Abyste ovšem nebyli ponecháni na milost a nemilost všem odvráceným aspektům programování, jsou pro vás připraveny materiály s mnoha užitečnými ukázkami, radami a tipy, takže i vaše aplikace budou tak rychlé, jak to jenom půjde. Takže, příjemné čtení a optimalizaci zdar!

 

Obsah

Místo optimalizace v procesu vývoje softwaru

Optimalizace objektivní a subjektivní rychlosti

Charakteristika základních optimalizačních voleb překladače

Kompilace do P-kódu

Kompilace do nativního kódu

Volba Optimize for Fast Code

Volba Optimize for Small Code

Volba No Optimization

Volba Favor Pentium Pro(tm)

Volba Create Symbolic Debug Info

 

 

Místo optimalizace v procesu vývoje softwaru

 

Ještě předtím, než si vyhrneme rukávy a pustíme se do skutečné optimalizace kódu, si povězme pár slov k optimalizací jako takové. Předem byste měli vědět, že optimalizační proces by měl být velice pečlivě a citlivě přepojen s vývojovým procesem softwarové aplikace. Jde o to, že optimalizace nepředstavuje pouze jednu fázi vývoje aplikace, je to také filozofie návrhu a vývoje softwaru. Zapomeňte na hlasy, které říkají, že nejprve je nezbytné napsat základní programový kód a ten poté optimalizovat. Lepší bude, když jakési „optimalizační myšlení“ zakomponujete do struktury každé funkce, procedury a každého řádku programového kódu, jenž napíšete. Zkuste myslet na to, jak docílit efektivního běhu funkce již tehdy, když teprve začínáte psát její primární kód. Při programování (a optimalizaci obzvlášť) byste měli neustále mít v duchu obraz toho, co chcete udělat. Když víte, co je třeba udělat, můžete se ptát, jak to lze provést. Pokud jste schopni odpovědět na tyto dvě zdánlivě jednoduché otázky, můžete přikročit k otázce třetí a nejdůležitější: „Jak docílit toho, aby se rychlost provádění programového kódu vyšplhala na maximum?“. Tak se, sice nepřímo, ovšem znovu, dostáváme k otázce vhodné modifikace stavby kódu.

 

Pokud budete mít na paměti skutečnost, že optimalizace se proplétá všemi etapami vývojového cyklu (obr. 1), získáte cennou konkurenční výhodu proti všem soupeřům a zvítězíte. A o to jde především, ne?

 

 

Obr. 1 – Optimalizace a vývojový cyklus aplikace

 

 

Optimalizace objektivní a subjektivní rychlosti

 

Abyste mohli lépe optimalizovat své aplikace, ujistěte se, že správně rozumíte pojmům objektivní a subjektivní rychlost aplikace.

 

Objektivní rychlost si můžete představit jako skutečné tempo práce funkčních modulů aplikace měřené v jistých časových jednotkách (obvykle v sekundách, nebo v milisekundách). Aby bylo možné říci, že rychlost je objektivní, musí být tato plně kvantifikovatelná. To znamená, že je potřebné tuto rychlost exaktně číselně vyjádřit. Kupříkladu si představte, že právě píšete funkci, které je jako argument předáno pole znaků, neboli textový řetězec. Vaším úkolem je napsat kód, který prohodí všechny znaky tak, že první bude posledním, druhý předposledním atd. Dejme tomu, že jste funkci napsali a nyní ji chcete otestovat. Napíšete tedy kód, ve kterém zavoláte funkci, nabídnete ji deset tisíc znaků a budete čekat na výsledek. Když budete schopni změřit dobu exekuce funkce, budete také vědět, jakou objektivní rychlostí funkce disponuje. Objektivní rychlost je vždy daná konstantní číselnou hodnotou, která udává, kolik časových jednotek uběhlo mezi spuštěním jistého procesu (např. již vzpomínané funkce) a vrácením výsledku tohoto procesu (okamžik, kdy funkce dokončila svou práci). V uvedeném příkladu byste třeba mohli dojít k informaci, že funkce vykonala svoje poslání přesně za dvě sekundy.

 

Jak docílit zvýšení objektivní rychlosti:

 

Na druhé straně, u subjektivní rychlosti není hlavním měřítkem tempa práce aplikace kvantifikace provádění jistých fragmentů programového kódu. Kdepak. Subjektivní rychlost aplikace totiž praví, jak dobře se finálnímu uživateli pracuje s vaší aplikací. Subjektivní rychlost tedy působí zejména na vědomí a pocity uživatele a snaží se jej přesvědčit, že práce s aplikací je rychlá a flexibilní. Pokud ovšem není možné subjektivní rychlost kvantifikovat, tak jak ji máme změřit? Možná, že budete překvapeni, ale jsem přesvědčen, že nejlepším „měrítkem“ subjektivní rychlosti aplikace je skutečně sám uživatel. Pokud uživatel uvidí, že aplikace se rychle spouští, pohotově reaguje na jeho podněty a bleskově překresluje okna, sdělí vám, že je s aplikací spokojen. V té chvíli si můžete být jisti, že subjektivní rychlost aplikace je vybroušena na maximum.

 

Jak docílit zvýšení subjektivní rychlosti:

 

 

Charakteristika základních optimalizačních voleb překladače

 

Visual Basic 6.0 disponuje značně výkonným překladačem programového kódu a dokonce vám dovoluje, abyste si upravili parametry samotné kompilace podle své chuti. Pojďme se nejprve podívat, jaké možnosti máte při kompilaci aplikace.

 

  1. Otevřete aplikaci, kterou chcete přeložit a z nabídky File vyberte příkaz Make Jméno_aplikace.exe.
  2. VB otevře okno Make Project. V tomto okně klepněte na tlačítko Options, na což se zobrazí okno Project Properties.
  3. V okně Project Properties klepněte na záložku Compile (obr. 2).

 

 

Obr. 2 – Okno Project Properties s aktivní záložkou Compile

 

Na záložce Compile se nachází několik voleb, které si rozebereme podrobněji.

 

Jak si můžete všimnout na obrázku, Visual Basic vám nabízí v podstatě jenom dva hlavní režimy kompilace programového kódu aplikace. Jde o kompilaci do P-kódu a kompilaci do nativního kódu. Podívejme se, co tato záhadná slova znamenají.

 

 

Kompilace do P-kódu

 

V dřívějších verzích jazyka VB byla kompilace do P-kódu jedinou možností, jak získat samostatný spustitelný soubor (.EXE). P-kód (angl. Packed Code) je typem zhuštěného kódu, který nelze provádět přímou cestou (pomocí instrukční sady procesoru). Proto si můžete P-kód představit jako jakýsi pseudokód, který sice je kódem, protože pozůstává z platných programových instrukcí, ovšem na to, aby mohl být přímo prováděn, musí být nejprve dodatečně přeložen. Tuto dodatečnou kompilaci P-kódu má na starosti speciální exekuční nástroj, jehož kód je uložen v doprovodní dynamicky linkované knihovně (.DLL). Exekuční nástroj zabezpečí kompilaci P-kódu na strojový (nativní) kód, jemuž je procesor schopen porozumět. Proces spuštění aplikace, která byla kompilována do P-kódu, můžete vidět na obr. 3.  

 

 

Obr. 3 – Schematické znázornění překladu P-kódu do nativního kódu

 

Zamyslíte-li se hlouběji nad stylem práce P-kódu a jeho následného překladu při spuštění aplikace, dojdete k poznání, že ona „just-in-time“ kompilace přece jenom spotřebovává jistý čas navíc.

 

Právě tento dodatečný překlad P-kódu po spuštění aplikace „má na svědomí“ skutečnost, že P-kód se, co se rychlosti týče, nemůže nikdy plně srovnávat s nativním kódem.

 

Na druhé straně je nutno podotknout, že právě existenci P-kódu vděčíme za pokročilé techniky při psaní programového kódu (okamžitá kontrola správnosti zapsaného kódu po stisknutí klávesy Enter) a rovněž tak při jeho odlaďování (zastavování exekuce na předem stanovených kontrolních bodech apod.). Mimo to se technologie P-kódu také velmi podobá moderním technikám, s kterými se můžete střetnout ve světě .NET. Vzato kolem a kolem můžeme prohlásit, že existence P-kódu je jasným kladem.

 

 

Kompilace do nativního kódu

 

Kompilace do nativního kódu znamená, že programový kód aplikace je překladačem přeložen přímo do strojového kódu, tedy do kódu, kterému procesor rozumí a může ho přímo provádět. Jak asi tušíte, kompilací rovnou do strojového kódu se zabezpečí, že výslední (přeložený) kód aplikace bude prováděn co možná nejrychleji. Ovšem pozor! I když aplikaci podrobíte kompilaci do nativního kódu, nemusíte vždy nutně dosáhnout také navýšení výkonu! Dokonce může dojít k situaci, kdy aplikace přeložena do strojového kódu bude v rychlostním souboji porazena svým P-kódovým protějškem. Proto nelze uplatňovat přístup bezhlavé kompilace do nativního kódu, je zapotřebí efektivněji psát programové konstrukce a optimalizovat ta místa, která jsou z pohledu výkonu aplikace kritická.

 

Vraťme se ovšem opět do prostředí Visual Basicu. Na záložce Compile okna Project Properties si můžete po vybrání volby Compile to Native Code všimnout další přístupné volby (obr. 4).

 

 

Obr. 4 – Zobrazení dalších možností volby Compile to Native Code

 

Povězme si o těchto volbách něco víc:

 

1. Volba Optimize for Fast Code

Volba Optimize for Fast Code je při kompilaci do nativního kódu aktivována standardně. Tato volba sděluje překladači, aby použil optimalizační nastavení pro vygenerování co možná nejrychlejšího kódu. To v skutečnosti znamená, že kompilátor se bude snažit, aby finální kód byl potenciálně nejrychleji prováděn, ovšem může dojít ke zvýšení velikosti spustitelného (.EXE) souboru.  

 

2. Volba Optimize for Small Code

V situacích, kdy vám bude záležet, aby velikost spustitelného souboru nepřekročila stanovený limit, můžete použít tuto volbu. Pokud ji aktivujete, kompilátor vygeneruje kód, který nemusí být nutně nejrychlejší, ale bude zaručeně co možná nejmenší.

 

3. Volba No Optimization

Možnost No Optimization můžete použít tehdy, když nebudete chtít použít žádná další optimalizační nastavení. Výsledkem aplikace uvedené volby by měl být spustitelný soubor s přijatelným výkonem a velikostí.

 

Další volby jsou vizuálně představovány jako zatrhávací pole, což znamená, že je můžete aktivovat současně s jednou z právě vysvětlených voleb (Optimize for Fast Code, Optimize for Small Code a No Optimization). 

 

4. Volba Favor Pentium Pro(tm)

Jestliže píšete aplikace, které budou běžet na počítačích s procesorem Intel Pentium Pro, můžete použít tuto volbu. Vygenerovaný programový kód bude využívat všech dovedností tohoto procesoru, ovšem při exekuci na jiných procesorových stanicích nemusí být tak výkonný.

 

5. Volba Create Symbolic Debug Info

Pokud ovládáte jazyk C++ a ani vývojové prostředí Visual C++ vám není cizí, můžete při kompilaci projektu zatrhnout toto pole, na což překladač sestaví jak spustitelný soubor aplikace, tak i soubor s koncovkou PDB, jenž bude obsahovat symbolické ladící informace o vygenerovaném spustitelném souboru. Symbolické informace vám pomůžou s dalším odlaďováním aplikace ve vývojových nástrojích, používajících ladící informace ve stylu CodeView.  

 

 

Příště prozkoumáme pokročilá nastavení optimalizace překladače, jež se skrývají pod tlačítkem Advanced Optimizations.  

 

 

Ján Hanák