Gabi und Sascha
Tags - Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Ein bizarres Problem. Ich schmeisse knapp 500.000 Element in eine HashMap. Die HashMap wurde mit einer initialen Kapazität von 500.000 erzeugt. Das Einfügen - inklusive parsen einer XML-Datei - dauert auf dem Mac ca. 9.200ms. Auf einem vergleichbaren Linux-System ca. 8.000ms. Soweit, so gut.

Bizarr wird es bei Abfragen. 100 look ups auf dem Mac werden in 99ms abgearbeitet - wiederholbar. Auf dem Linux-System sind es immer mehr als 21.000ms. Egal, ob ich Beas JRockit verwende, das JDK von Sun oder das JDK von IBM. Ob 5. oder 6. JDK ist ebenfalls unerheblich. Der Prozess hat genug Hauptspeicher (1,5 GB) und lagert nicht auf Platte aus - der JIT kann wunderbar optimieren. Wird eine TreeMap an Stelle der HashMap verwendet, tritt das gleiche Phänomen auf.

Im Augenblick sitze ich mit grossen Augen vor dem Problem und weiss nicht weiter.

Nachtrag: Die Beschreibung oben ist nicht korrekt. Ich rufe die HashMap nicht direkt auf, sondern über eine Groovy Methode. Dieser Methodenaufruf frisst die Zeit. Es ist nicht die Implementierung der HashMap. Deren look up Zeit ist im Millisekundenbereich nicht messbar. Soweit also mein Fehler. Jetzt gilt es heraus zu finden, wie ich den Groovy-Teil beschleunigen kann und ob dies überhaupt geht. Grund: der Aufruf erfolgt über einen sun.reflect.GeneratedMethodAccessor. Erschüttert bin ich darüber, dass Apples Implementierung soviel besser ist.

Nachtrag 2: Ich habe das Problem jetzt ziemlich dreckig gelöst. Das Feld der HashMap habe ich public gemacht und greife jetzt direkt darauf zu.


Wie wäre es mit "pure Java"?

Das werde ich auch tun. Noch ist die Applikation nicht so gross, als dass ich sie nicht schnell portieren kann. Faktisch ist der Einsatz von Grails & Groovy an dieser Stelle gescheitert. Was nicht bedeutet, dass Grails ein schlechtes Werkzeug ist. Wir haben ein Tool zur Verwaltung von Thesauris auf Grails Basis entwickelt. In dem Bereich der Datenbank gestützten Software, im Zusammenspiel mit Spring und Hibernate, leistet Grails hervorragende Dienste. Für derartige Tools würde ich immer wieder auf Grails zurück greifen. Dies auch in Hinblick auf die Entwicklungsgeschwindigkeit. Nur eben nicht für den beschriebenen konkreten Anwendungsfall.