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