Az előző posztomban bemutatott városgenerálás már egészen ügyesen működik. Csupán annyi a gond vele, hogy lassú. Becsléseim alapján egy nagyobb metropolisz legenerálása simán igénybe vehet minimum 10 percet. Mit lehet ilyenkor tenni? Előkapjuk a profilert, meghatározzuk a progi gyenge pontjait, és optimalizálunk!
Rendben, lassú a progi, és szeretnénk, ha még az épp aktuális világvége-határidő előtt befejezné a munkát. Az első lépés az az, hogy meghatározzuk, mitől olyan lassú? Erre vannak kitalálva a profilerek. Akit érdekel, hogy működnek olvasson utána, nekünk most elég annyi, hogy futásidőben (tehát futtatni kell a progit) statisztikát készít a programról. Pl. hogy melyik függvényt hányszor hívták meg, melyik függvényben mennyi időt töltött a kód, stb. Hát nézzük, a mi kis városgenerátorunk mit produkál (a szükségtelen részleteket nem közlöm. De van bőven abból is :D):
COST CENTRE MODULE %time %alloc
getByIndex Graph 35.7 0.4
drawLine CityGen 29.6 47.8
drawSquare CityGen 26.6 44.2
run CityGen 1.9 0.0
display CityGen 1.2 0.0
changeNode Graph 1.1 3.2
makeVector Geometry 0.3 1.7
Nézzük. A getByIndex az én művem, a gráfban megkeres egy elemet az indexe alapján (élt, vagy csomópontot). Úgy tűnik, hogy az egész idő 35%-át itt tölti el. Ami 3 és fél percből laza egy percet jelent. A drawLine és drawSquare igazából nem érdekel minket, mivel a végső kód nem fog a rajzolással foglalkozni, csak szegény hülye fejlesztőnek kell az, hogy vizuálisan is felfogja az adatokat. A többi pedig láthatóan elhanyagolható.
A getByIndex fog egy tömböt, amiben minden elemhez van egy index rendelve (nem, nem mappel oldottam meg, mert nem akartam még azzal is szenvedni, most már lehet, hogy belenézek), és az index alapján keresi ki a megfelelő elemet. A feladat, hogy ezt optimalizáljuk. Az ötlet, hogy eleve rendezetten tartsuk a listát, és akkor vagy logaritmikus, vagy konstans időben ki tudjuk szedni a megfelelő elemet. A másik lehetőség, hogy rábízzuk ezt a feladatot egy profira, aki már írt egy ilyet. Ilyen leeht pl a Data.Map könyvtár, amit még nem néztem meg, mire jó, de azt hiszem, köze lehet a problémámhoz.