Loop speedup

Bosnjak Zoran ITWEP Bosnjak at iskratel.si
Wed Jul 28 14:50:31 CEST 2004


Ce v zanki namesto "dist" uporabis "tmp", je prevajalnik verjetno ugotovil, da je "tmp" neuporabljena spremenljivka in je zato izlocil vrstico "tmp += d*d ". Ta vrstica se potem sploh ni izvajala, zato taksna pohitritev (seveda pa nimas rezultata).

To lahko preveris, ce pogledas v kaj se obe varianti prevedeta (assembler).

Nekaj malega bos prihranil, ce namesto funkcije uporabis DEFINE oz. inline funkcijo.

lp,
Zoran

-----Original Message-----
From: Gregor Berginc [mailto:gregor.berginc at guest.arnes.si]
Sent: Wednesday, July 28, 2004 1:15 PM
To: lugos-prog at lugos.si
Subject: [SPAM - Header] - [LUGOS-PROG] Loop speedup - Email found in subject


Zivjo,

Od vceraj popoldne se ze matram s pohitritvijo enga dela 
predprocesirnega algoritma. Spodnja rutina naj bi izracunala evklidsko 
razdaljo med dvema vektorjema:

----------------------------

double FeatureDistance::euclideanDistance(Feature *_f1, Feature *_f2) {
     int fSize = _f1->getSize();
     int *f1Value = _f1->getValue();
     int *f2Value = _f2->getValue();

     long dist = 0;
     for (long i = 0, tmp = 0; i < fSize; i++) {
         int d = (*f1Value) - (*f2Value);
         dist += d * d;   /**** tole je problem *****/

	f1Value++;
	f2Value++;
     } // for

     return sqrt(dist);
} // euclideanDistance

----------------------------

Problem je, da je v tej izvedbi blazno pocasna. Gre namrec za to, da se 
ta rutina poklice ogromnokrat, zato je vsaka pohitritev bistvenega 
pomena. Se najbolj me jezi, da ce namesto dist v problematicni vrstici 
uporabim tmp (definiran na zacetku for zanke) stvar pade skoz: namesto 
25s porabi 2.75s.

Zato me zanima, ce kdo izmed vas ve, kako bi spravil tmp ven (if v zanki 
seveda ne pride v postev).

lp,
Grega

p.s. Kaj bi sedaj dal za MS compiler, ki je imel tist "feature", da je 
spremenljivke definirane v for headerju pustil tudi kasneje :)



More information about the lugos-prog mailing list