[Java lista] for: ++i vagy i++

Peter Verhas peter at verhas.com
2009. Feb. 8., V, 22:42:59 CET


Ha már lecsúsztunk idáig...

Ez független attól, hogy 'n' mekkora. Amikor megfelelően optimalizálva
gépi kódra fordul az egyik, meg a másik metódus mind a kettőből
ugyanaz a kód lesz, vagy ha nem, akkor nem optimalizál elég jól a
fordító.

Viszont nem voltak mindig jó fordítók és optimalizálók. A t1 esetben
olyan kódot generáltak, ami valahogy így nézett ki:

LD REGi, 0
t0:
CMP REGi,#N
JE t01
PUSH REGi
CALL MUVELET
POP
INC REGi
JUMP t0
t1:

A t2 esetében pedig:

LG REGi,#N
CMP REGi,#0
JZ t01
t0:
PUSH REGi
CALL MUVELET
POP
DEC REGi
JNZ t0
t1:

A lényeg az volt, hogy NEM kellett hasonlítani, mert ha egy regiszter
(valószínűleg az összes processzornál) inkrementálás vagy
dekrementálás után nulla lett, az automatikusan bebillentett egy
flaget, amire hivatkozni lehetett a következő ugró utasításnál. Tehát
mindenképpen gyorsabb volt a t2, mint a t1, és ha n nem int volt,
hanem long, esetleg 'long long' akkor méggyorsabb volt a második
megoldás, mint az első.

> Kérdés miért jobb a t2-es hívás, mint a t1? (Iterációnként legalább egy
> belső hívással.)
> void t1(int n){
>        for (int i=0; i<n; i++){
>            muvelet(i);
>        }
>    }
> void t2(int n){
>        for (int i=n; i>0; i--){
>            muvelet(i);
>        }
> }
> Megj:  n jöhet paraméterből vagy kaphat értéket a műveleten belül is,
> ebből a szempontból lényegtelen.
>
> Válasz: azért gyorsabb, mert  t1-ben folyamatosan n-hez kell hasonlítani
> és ez iterációnként  legalább egy plusz kiértékelés. Ha n kellően nagy,
> akkor már számottevő a különbség, és van ahol számít!

Martin Fowler azt mondja, hogy minden ilyenen agyalni ma már
bohóckodás. Ha gyors kódot akarsz, akkor első körben figyelj arra,
hogy ne írj nagyon szar kódot (pl. ne olvass fájlból buffer nélkül
karakterenként). Utána ha elég gyors a programod, akkor azzal
foglalkozz amiért fizetnek. Ha nem elég gyors, akkor két eset van:

1. Tapasztalatlan vagy. Tippeld meg, hogy hol kell optimalizálni. Írd
le magadnak egy papírra (csak, hogy ne csapd be magad utána). Engedd
rá a profilert. Csodálkozz, és optimalizáld ahol a profiler szerint
kell.

2. Tapasztalt vagy. Ekkor úgyis az 1. fogod csinálni.


-- 
Verhás Péter
ügyvezető
Verhás & Verhás Szoftver Manufaktúra Kft.
peter at verhas.com
t: +36(30)9306805


További információk a(z) Javalist levelezőlistáról