<meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
<h2>J2ME pro pokroΦilΘ - optimalizace zdrojovΘho k≤du s profilΘrem</h2>
<p id='prepend'>V jednom z p°edchozφch Φlßnk∙ jsme si teoreticky rozebrali zßkladnφ techniky, kterΘ se v J2ME b∞₧n∞ pou₧φvajφ pro optimalizaci k≤du. Pokud chceme jφt jeÜt∞ dßle, je t°eba pou₧φt n∞kter² ze specializovan²ch nßstroj∙, kter² zjistφ, jak jsou zkoumanΘ Φßsti k≤du nßroΦnΘ na provedenφ. Jeden takov² nßstroj je souΦßstφ Wireless Tooliktu a my si zde ukß₧eme, jak se s nφm pracuje.</p>
<h3>Kdy optimalizovat?</h3>
<p>JeÜt∞ ne₧ se vrhneme na optimalizaci, je t°eba si polo₧it otßzku, zda mß dalÜφ optimalizace smysl. V zßkladu m∙₧eme rozd∞lit nßroΦn∞jÜφ aplikace, p°edevÜφm hry, do dvou skupin, na <em>Input-Drive</em> a <em>Real-Time</em>. Do prvnφ zmφn∞nΘ skupiny pat°φ hry, kterΘ jsou zalo₧eny na vstupu u₧ivatele, typick²m p°φkladem jsou karetnφ hry nebo Üachy. Zde p°φliÜ nezßle₧φ na rychlosti, proto dalÜφ optimalizace nemß smysl. Zajφmav∞jÜφ skupinou jsou ovÜem realtime hry, kterΘ jsou typickΘ akcφ na displeji telefonu. Od t∞chto her oΦekßvßme, ₧e budou rychle reagovat na vstup od u₧ivatele, a budou mφt dostateΦn∞ vysok² framerate (FPS) pro plynulou animaci. Typick²m p°φkladem jsou arkßdy, akΦnφ hry a realtime strategie.</p>
<p>P°i optimalizaci je t°eba si ale uv∞domit, ₧e existujφ d∙vody proΦ neoptimalizovat:</p>
<li>n∞kterΘ techniky mohou snφ₧it mo₧nost portace na jinou platformu</li>
<li>je to zdlouhavß a mravenΦφ prßce</li>
</ul>
</div>
<h3>ProfilΘr</h3>
<p>Jak ji₧ bylo °eΦeno v ·vodu Φlßnku, souΦßstφ KToolbaru je i nßstroj naz²van² ProfilΘr. Spus¥te KToolbar, zvolte "edit/preference" a vyberte kartu "monitoring". Najd∞te pole "Enable profiling" a zaÜkrtn∞te jej. Tφm mßte zajiÜt∞no, ₧e p°i ka₧dΘm spuÜt∞nφ naÜφ aplikace bude spuÜt∞n i profilΘr.</p>
<p>Ne₧ se pustφte dßle, stßhn∞te si nejprve <a href='podklady/prochazka/991/src.zip'>originßlnφ zdrojovΘ k≤dy</a> testovacφ aplikace a d∙kladn∞ si je prostudujte. Ze zdrojov²ch k≤du je vid∞t, ₧e funkΦnφ p°φnos je nulov², ale pro naÜe experimenty to nenφ podstatnΘ. Vytvo°te si nov² projekt pomocφ KToolbaru, jako default za°φzenφ vyberte "DefaultGrayPhone" a spus¥te aplikaci. Prove∩te test a zav°ete aplikaci. Pokud jste sprßvn∞ nastavili pou₧itφ profilΘru, objevφ se vßm podobnΘ okno s v²sledky.</p>
<div class='image'>
<img src='podklady/prochazka/991/profiler-small.png' alt='Okno profilΘru s nam∞°en²mi daty' title='Okno profilΘru s nam∞°en²mi daty' />
<br /><span class='comment'>Okno profilΘru s nam∞°en²mi daty (<a href='podklady/prochazka/991/profiler.png'>plnß velikost, cca 11 kB</a>)</span>
</div>
<p>V levΘ Φßsti okna se nachßzφ stromovß struktura metod, tak, jak jsou navzßjem volßny. V pravΘ Φßsti jsou nam∞°enΘ v²sledky. Aby se nßm s nimi lΘpe pracovalo, v²sledky si se°adφme. Vyberte z menu "View/Sort By/%Cycles". Jak vidφte, na prvnφch t°ech mφstech se umφstila metoda pro vykreslenφ textu na displej, kterß je souΦßsti metody <code>paint</code> (54 %), metoda <code>doModel</code> (12 %) a <code>work</code> (9 %). Procenta v zßvorce vyjad°ujφ nßroΦnost. Berte tato Φφsla s rezervou, proto₧e se m∞nφ v zßvislosti na rychlosti PC. My je zde pou₧ijeme jako referenΦnφ hodnoty, se kter²mi budeme porovnßvat dalÜφ v²sledky. Chceme-li tedy zrychlit naÜi aplikaci, musφme se zam∞°it na tyto t°i metody.</p>
<h3>Optimalizace</h3>
<p>Optimalizaci rozd∞lφme na dv∞ Φßsti - optimalizace modelu a optimalizace vykreslovßnφ.</p>
<h4>Optimalizace vykreslovßnφ</h4>
<p>Vykreslovßnφ mß na sv∞domφ metoda paint, kterß je definovßna takto:</p>
<p>Podφvßme-li se na k≤d tΘto metody, zjistφme, ₧e smyΦka obsahuje Φßsti, kterΘ m∙₧eme napsat jako <code>static final</code>. Jsou to tyto Φßsti k≤du:</p>
<div class='list'>
<ul>
<li>ve smyΦce se stßle volajφ metody pro zjiÜt∞nφ velikosti displeje, kter² mß konstantnφ rozm∞ry</li>
<li>neustßle se zφskßvß tent²₧ objekt fontu</li>
<li>kotva (?; anchor) umφst∞nφ textu se nem∞nφ</li>
</ul>
</div>
<p>DalÜφm kandidßtem na optimalizaci je zφskßnφ nßhodnΘho Φφsla polohy textu na displeji. LepÜφ je, pokud nßm to pam∞¥ dovolφ, p°edpoΦφtat hodnoty do tabulek a pak z nich hodnoty jen vybφrat. P°φstup do pole je p°eci jen rychlejÜφ, ne₧ neustßlΘ zφskßvßnφ hodnot.</p>
<p>Nejv∞tÜφ vrßsky nßm ale d∞lß vykreslovßnφ vlastnφho textu. Z p°edchozφho Φlßnku je jasnΘ, ₧e je t°eba pou₧φt <code>StringBuffer</code>. Jeho napln∞nφ provedeme zavedenφm °et∞zcovΘ konstanty <samp>MESSAGE</samp> s textem, kter² budeme vykreslovat. Abychom si to trochu ulehΦili, budeme text (FPS) p°idßvat na konec tΘto konstanty. Tφm se vyhneme neustßlΘmu vytvß°enφ nebo ne zrovna jednoduchΘmu zφskßnφ v²slednΘho textu. Proto₧e se prvnφ Φßst textu nem∞nφ, postaΦφ, kdy₧ odstranφme starou Φßst a nahradφme ji novou.</p>
<p>P°edchozφmi optimalizacemi jsme se sice zbavili neustßlΘho vytvß°enφ objekt∙, ale jeÜt∞ to nenφ ono. Proto obsah StringBufferu vykreslφme do externφho obrßzku a ten pak p°eneseme na displej. Abychom nem∞nili obsah obrßzku neustßle, vlo₧φme jeÜt∞ podmφnku, kterß nßm zajistφ, ₧e se obrßzek zm∞nφ, jen kdy₧ se zm∞nφ hodnota FPS.</p>
<p>Provedeme-li nynφ m∞°enφ, zjistφme, ₧e nßroΦnost vykreslovßnφ klesla p°ibli₧n∞ na polovinu, tedy 22 %. O to vφce se ale projevilo volßnφ metod <code>work()</code> (15 %) a <code>doModel()</code> (11 %).</p>
<h4>Optimalizace modelu</h4>
<p>Model je zalo₧en na t°ech metodßch <code>work()</code>, <code>doModel(int n)</code> a <code>mathOperation(int a, int b, int c)</code>. Metoda <code>work()</code> volß ostatnφ dv∞. Nejprve bychom se m∞li zbavit globßlnφch prom∞nn²ch tφm, ₧e z nich vytvo°φme lokßlnφ prom∞nnΘ. Dßle vidφme, ₧e volßnφ metody <code>doModel</code> lze p°enΘst do t∞la prvnφ smyΦky.</p>
<p>P°i psanφ k≤du se obvykle sna₧φme, aby se Φßsti neopakovaly. Vytvo°φme tedy metodu a tu pak volßme z jin²ch Φßstφ k≤du. V kritick²ch Φßstech je ale volßnφ metody pomalΘ a je lepÜφ (pokud je to mo₧nΘ) p°enΘst jejφ t∞lo p°φmo do kritickΘho k≤du. V naÜem p°φpad∞ to je metoda <code>mathOperation</code>. NßÜ p°φpad nßm dßle umo₧≥uje p°epsat smyΦky tak, aby se provßd∞lo testovßnφ na nulu.</p>
<p>DalÜφm nezanedbateln²m faktorem je i modifikßtor metody. P°esto₧e jsou metody <code>work</code> a <code>doModel</code> takzvan∞ <em>synchronized</em>, m∙₧eme tento modifikßtor odstranit, proto₧e neexistuje nikdo jin² ne₧ my, kdo bude tuto metodu volat. Zde je seznam modifikßtor∙, se°azen²ch od nejpomalejÜφho k nejrychlejÜφmu:</p>
<div class='list'>
<ul>
<li>synchronized</li>
<li>interface</li>
<li>normßlnφ volßnφ</li>
<li>final</li>
<li>static</li>
</ul>
</div>
<p>Metodu <code>work</code> m∙₧eme jeÜt∞ optimalizovat tφm, ₧e rozepφÜeme vn∞jÜφ smyΦku, kterß je tvo°ena osmi cykly. I kdy₧ se m∙₧e zdßt, ₧e je to mrhßnφ mφstem, je t°eba si uv∞domit, ₧e v²sledn² k≤d se komprimuje a opakovanΘ Φßsti se komprimujφ zvlßÜ¥ dob°e.</p>
<h3>V²sledky</h3>
<p>Stßhn∞te si <a href='podklady/prochazka/991/src_optimized.zip'>modifikovanΘ zdrojovΘ k≤dy</a> a porovnejte si je s p∙vodnφmi. Otestujeme-li p∙vodnφ k≤d na reßlnΘm za°φzenφ (pou₧il jsem SE T610, firmware R3C002), zφskßme v²sledek p°ibli₧n∞ 12 405, po optimalizaci je v²sledek 5 920. Co₧ je o vφce ne₧ polovinu lepÜφ. N∞kolik obecn²ch rad pro optimalizaci:</p>
<div class='list'>
<ul>
<li>Pou₧φvejte profilΘr, kter² vßm ukß₧e, kde optimalizovat.</li>
<li>Zva₧te pou₧itφ modifikßtoru metod.</li>
<li>Pou₧φvejte tabulky s p°edpoΦφtan²mi hodnotami.</li>
<li>Pou₧φvejte <code>setClip()</code> metodu pro omezenφ p°ekreslovanΘ oblasti.</li>
<li>Sna₧te se vylepÜit sv∙j algoritmus.</li>
<li>Pou₧φvejte malΘ hodnoty konstant u p°φkazu <code>switch</code>.</li>
</ul>
</div>
<p>Jak vidφte, i kdy₧ je optimalizace n∞kdy nßroΦnß, je to i zßbava. Ale p°esto neoptimalizujte k≤d hned od zaΦßtku. Nejprve se zam∞°te na funkΦnost a pak provßd∞jte optimalizace. Je mo₧nΘ, ₧e n∞kterΘ metody p°epφÜete i n∞kolikrßt, ale v²sledek bude urΦit∞ stßt za to. Hodn∞ zdaru p°i optimalizaci.</p><div class='refer'><h3><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/serial.asp?serial=36' title='p°ehled Φlßnk∙ vΦetn∞ anotacφ'>J2ME pro pokroΦilΘ</a></h3><p>Pokud to myslφte s Java 2 MicroEdition opravdu vß₧n∞, jist∞ ocenφte tento p°ehled ne zcela obligßtnφch programovacφch technik a postup∙. ╚lßnky na sebe sice p°φmo nenavazujφ, zato zvolenΘ tΘma zkoumajφ opravdu do hloubky. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!</p><ul><li><strong>J2ME pro pokroΦilΘ - optimalizace zdrojovΘho k≤du s profilΘrem</strong> (prßv∞ Φtete)</li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3162'>J2ME pro pokroΦilΘ - znovu J2ME a Ant</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2853'>J2ME pro pokroΦilΘ - XML</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2409'>J2ME pro pokroΦilΘ - J2ME a Ant</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2377'>J2ME pro pokroΦilΘ - logovßnφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2281'>J2ME pro pokroΦilΘ - optimalizace zdrojovΘho k≤du</a></li></ul></div>