Hoi,
Voor een ontwerpproject moet ik een programma schrijven dat voor een lijst met lijnen de optimale tekenvolgorde van deze lijnen bepaald. Hiervoor maak ik gebruik van een dynamisch geprogrammeerd recursief algoritme, dat simpelweg alle mogelijke tekenvolgordes bekijkt en de kortste bepaalt. Tussenresultaten worden door dit algoritme opgeslagen in een HashMap, zodat ik deze resultaten er later ook weer snel uit kan halen.
Nou probeerde ik de snelheid van dit algoritme te verbeteren door de initiële capaciteit van de HashMap zodanig te kiezen dat er zo min mogelijk rehashes optreden. Dit is mogelijk omdat ik van te voren ongeveer kan bepalen hoeveel stores er plaats gaan vinden in de HashMap voor een bepaald aantal lijnen. Ik ging dus wat lopen testen en kwam tot de volgende resultaten:
230.000 stores, initial capacity 2: 182 seconds.
230.000 stores, initial capacity 3.000: 184 seconds.
230.000 stores, initial capacity 30.000: 187 seconds.
230.000 stores, initial capacity 300.000: 201 seconds.
Zoals je ziet neemt de rekentijd voor grotere initiële capaciteiten toe, in plaats van af. Ik zou juist denken dat door een grotere initiële capaciteit er minder rehashes hoeven plaats te vinden waardoor het juist sneller zou moeten gaan. Ga maar na, voor 230.000 stores moet je met een initial capacity van 2 maar liefst 18 rehashes uitvoeren (ervan uitgaande dat een rehash de capaciteit grofweg verdubbeld) terwijl je met een initial capacity van 300.000 geen enkele rehash zou hoeven uit te voeren. Heeft iemand enig idee hoe het toch trager kan zijn? Ligt dit aan de JVM?
Wat relevante info: AMD XP 1900+, 512 MB DDR, Windows XP SP2, Java SDK 1.4.2.
B.v.d.
Voor een ontwerpproject moet ik een programma schrijven dat voor een lijst met lijnen de optimale tekenvolgorde van deze lijnen bepaald. Hiervoor maak ik gebruik van een dynamisch geprogrammeerd recursief algoritme, dat simpelweg alle mogelijke tekenvolgordes bekijkt en de kortste bepaalt. Tussenresultaten worden door dit algoritme opgeslagen in een HashMap, zodat ik deze resultaten er later ook weer snel uit kan halen.
Nou probeerde ik de snelheid van dit algoritme te verbeteren door de initiële capaciteit van de HashMap zodanig te kiezen dat er zo min mogelijk rehashes optreden. Dit is mogelijk omdat ik van te voren ongeveer kan bepalen hoeveel stores er plaats gaan vinden in de HashMap voor een bepaald aantal lijnen. Ik ging dus wat lopen testen en kwam tot de volgende resultaten:
230.000 stores, initial capacity 2: 182 seconds.
230.000 stores, initial capacity 3.000: 184 seconds.
230.000 stores, initial capacity 30.000: 187 seconds.
230.000 stores, initial capacity 300.000: 201 seconds.
Zoals je ziet neemt de rekentijd voor grotere initiële capaciteiten toe, in plaats van af. Ik zou juist denken dat door een grotere initiële capaciteit er minder rehashes hoeven plaats te vinden waardoor het juist sneller zou moeten gaan. Ga maar na, voor 230.000 stores moet je met een initial capacity van 2 maar liefst 18 rehashes uitvoeren (ervan uitgaande dat een rehash de capaciteit grofweg verdubbeld) terwijl je met een initial capacity van 300.000 geen enkele rehash zou hoeven uit te voeren. Heeft iemand enig idee hoe het toch trager kan zijn? Ligt dit aan de JVM?
Wat relevante info: AMD XP 1900+, 512 MB DDR, Windows XP SP2, Java SDK 1.4.2.
B.v.d.
[ Voor 7% gewijzigd door Mitt3nz op 29-03-2005 21:14 ]