AVR32

Andras Tantos andras at tantosonline.com
Sat Mar 11 01:04:52 CET 2006


Hali!

> > Fordításkor még nem tudhatod, hogy min fog futni.
>
> Bizony! Arról nem is szólva, hogy sokan úgy gondolják, hogy optimalizálás 
> =
> legyen minél gyorsabb a program. Pedig sok minden másra is lehet
> optimalizálni.
>
> Sot, van, hogy nem is a program közvetlen jellemzojére akarunk
> optimalizálni.. Hanem pl. fejlesztési idore. És akkor nem mindegy, hogy
> mennyi ideig kell üldözni egy eltévedt pointert, vagy egy memory leaket. 
> És
> ebben a nyelv és a környezet nagyon nagy segítségre tud lenni.
>
> Szabolcs
>

Nem birom tovabbb, most mar bele kell szoljak kicsit.

A futasi ideju (pontosabban a dinamikus analizis apaljan torteno) 
optimalizalas tenyleg jo dolog, de persze nem csak Java-ban lehet 
megcsinalni. A lenyeg az, hogy amig nem tudod, hogy a programot hogyan 
hasznaljak, sok atalkitasrol nehez eldonteni, hogy valoban megeri-e, vagy 
eppen bajt csinal. Egy pelda: egy fuggveny inline megvalositasa altalaban 
gyorsabb kodot eredmenyez, mert pl. nem toltunk extra idot a hivassal (ez 
csak az egyik, es meg csak nem is a legfontosabb elony, de ez most 
mellekes). Igenam, de ez sajnos a kod meretenek a novekedesevel jar, ami 
lecsokkenti a cache talalati valoszinuseget, tehat lehet, hogy eredoben 
lassabb lesz a kod. Megeri? A fene tudja, ki kene probalni. No, ez az amit 
nem lehet forditasi idoben megcsinalni, csak futasi idoben. Egy masik ilyen 
dolgog a 'loop-unrolling'-nak nevezett optimalizalas. Hogy merei-e nagyon 
fugg attol, hogy a ciklus hanyszor fut le, ezt pedig sokszor lehetetlen 
eldonteni a kod statikus analizise alapjan. Raadasul ugye nem lehet minden 
fuggvenyt inline-a tenni, nem lehet minden hurkot teljeseni szetteriteni, 
mert a program elfogadhatatlanul nagyra none. Azaz ha a fordito ugy dont, 
hogy egy fuggvenyt inline-ba rak, akkor ez azt is jelenti, hogy egy masikat 
nem tehet azza. Melyik tehat a fontosabb, A, vagy B? Nos, nyilvan a 
gyakrabban hasznalt, de melyik is az?

No szoval, ezert szeretnek a forditok tudni arrol, hogy a programot hogyan 
hasznaljak. Ha JIT (just-in-time compiler) alapu rendszerrel van dolgunk, 
mint a Java vagy a .NET, akkor ez aranylag egyszeru, hiszen a fordito egy 
gepen, egy idoben fut az alkalmazassal. Tradicionalis C/C++ kornyezetben ez 
nehezebb, itt a 'profile-guided' optimalizalast szoktak hasznalni (pl. a 
legujabb VC++ tudja).

Van azonban egy nagy problema: leven a JIT egyszerre fut az alkalmazassal, 
nagyon oda kell figyelni arra, hogy az optimalizalasok gyorsan elvegezhetok 
legyenek, hiszen a forditasi ido hozza adodik (valamilyen aranyban) az 
alkalmazas futasi idejehez. Igy aztan az igazan izmos optimalizalasokat nem 
szoktak a JIT-ek megcsinalni, es sajnos ezek kozott vannak azok is, amik 
igazan sokat profitalnanak a futasi adatok ismeretebol.

Van itt aztan meg egy-ket nagy gond, bar ezek mar nem kapcsolodnak szorosan 
az elozohoz. Az egyik, hogy a runtime alapu rendszereknel a runtime (es a 
JIT) jelenlete szukseges a program futasahoz. Ezt elso alkalommal be kell 
tolteni a memoriaba, ami bizony sokaig eltarthat. Ezert van, hogy a Java (es 
.NET btw) alkalmazasok olyan lassan indulnak el. A futas soran pedig a 
runtime vegig a memoriaban kell legyen, ami megnoveli a memoria-igenyt, 
lecsokkenti a cache talalti pontossagat, es konnyen vezethet komolyabb 
'paging'-hez. Raadasul ha hatekony akar lenni a rendszer, akkor egyszerre a 
memoriban kell tarolja a program eredeti byte-kodjat, es a leforditott 
reszeket is (hacsak nem csinal valami nagyon ugyeset, de erosen kerdeses, 
hogy megerne-e). Ez megint a memoria-igeny novekedesehez vezet. Ott van 
aztan a szemet-gyujtogetes, ami megitcsak noveli a memoria-igenyt, hiszen 
sok nem elo objektum is a memoriaban van meg. A nem-determinisztikus 
felszabaditas ugy altalaban is nagyon meg tudja az eletet neheziteni, de van 
vele meg egy nagy gond. Nevezetesen, hogy ilyen rendszerben nem lehet a kod 
egy darabjat dinamikusan ki-be totogetni a memoriabol, ugy, ahogy DLL-eket 
lehetett regen. Meghozza azert nem, mert a program nem tudja garantalni, 
hogy az osszes objektum, ami belehiv ebbe a koddarabba fel van szabaditva, 
pontosan a szemet-gyujtogetes es az ebbol kovetkezo nem-determinisztikus 
felszabaditas miatt. Meg a futtato kornyezet is csak nagyon nagy nehezsegek 
(ertsd ido/memoria) aran tudna ezt nyivantartani. Ezert aztan, legalabbis 
.NET alatt nem is lehet kod-reszleteket kivenni a memoriabol, ha azok 
egyszer oda bekerultek (azaz olyan van, hogy Assembly.Load, de olyan nincs, 
hogy Assembly.Unload). Gondolom a Java is ilyen, bar azzal nincs konkret 
tapasztalatom. Ez aztan ismetelten a memoria-igeny novekedesevel jar, 
kulonosen nagy, osszetett alkalmazasoknal.

Mindez oda vezet, hogy ezeknek a rendszereknek nagyon komoly skalazasi 
problemaik vannak, roviden komolyabb vasat igenyelnek - elsosorban tobb, 
gyorsabb memoriat. Ettol persze se a Sun, se az Intel, se az AMD nincs 
kulonosebben ketsegbe esve (tanulsag, ha egy HW gyarto nyom egy SW 
technologiat, az ember legyen ovatos :-)).

No, azt hiszem mara eleget irogattam, be is fejezem. Ja, mindenkinek 
koszonom a NYAK-gyarto tippeket.

Udv,
Tantos Andras





More information about the Elektro mailing list