[Java lista] számítási teljesítmény
Szilard Cs.
cs.szilard.linux at freemail.hu
2009. Aug. 30., V, 11:03:50 CEST
Szia, Sziasztok!
> A segítségeteket szeretném kérni, hogy egy nagy számítás igényű
> programnál milyen JVM paramétereket ajánlotok? Vázolom miről van szó.
Röviden: ahogy a többiek is írták, szerintem is érdemes
megpróbálni optimalizálni a kódot is, és nem csak a futtatási
paramétereket állítani.
Hosszabban:
Pár hónapja részt vettem egy programozói versenyben, ahol egy
számításigényes feladatra kellett minél gyorsabb megoldást írni.
Több ötlet is volt, amivel a győztesek nyertek (kb. hasznossági
sorrendben) :
* Optimalizálták a megoldást algoritmuselméleti szempontból
(átgondolták, hogy lehetőleg semmit se számoljon kétszer a program). Ez
nagyságrendileg _kb._ 50-szeres gyorsulást adott. (Ez erősen
feladattól függ. Nem tudom, nálad mennyit hozhat.)
* Ahol lehetett, tömb helyett változót használtak, mert a
tömbelérés plusz időt igényel. (10 alatti, de talán 2 alatti gyorsítás.)
* Elérték, hogy egy időben/ciklusban egyszerre csak ,,kevés'' adattal
foglalkozzon a processzor. (Nagyságrandileg kb.: 500 változó helyett
csak 50-nel(?)) Ez valószínűleg azért gyorsított, mert nem kellett
gyakran a következő szintű memóriacache-hez nyúlnia a processzornak. Ezt
akár a humán átláthatóság rovására is tették. (10 alatti, de talán 2
alatti gyorsítás.)
* Számításelméleti megfontolások (páros számok összege és különbsége
csak páros lehet, stb.), amikkel nem fárasztanálak.
* stb.
A fordító- és tesztrendszer egységes volt, ezért a kapcsolók állítása
nem került terítékre.
Úgy tűnt, hogy az optimalizálásba fektetett munkaidő az elején
jobban, majd egyre kevésbé térül meg: a programok sebessége
a befektetett idővel aszimptotikusan közelített egy határhoz.
A leggyorsabb megoldásnak kb. 100-ad annyi időre volt szüksége, mint
a ,,naív'' megoldásnak.
Volt egyszer egy egyetemi verseny is. (Az nem Java volt.) Ott olyan
lett a feladat, hogy _szigorúan_ algoritmikus szempontból nem lehetett
optimalizálni a megoldást. A leggyorsabb megoldás egy tök tömör kód
volt, s ez kb. 10-szer olyan gyorsan futott, mint a leglassabb.
Szilárd
További információk a(z) Javalist levelezőlistáról