Also, ich habe dieses Java-Programm, mit dem ich mehrere Terabyte an Daten verarbeite. Leistung ist ein Anliegen.
Ich habe die App analysiert, und ein großer Teil aller Speicherzuweisungen sowie eine große Menge an CPU-Zeit stammen von der Durchführung einer einfachen Operation:
Ich habe ein Array von ASCII-Zeichen. Ich weiß, dass die Zeichen von Offset i
bis Offset j
eine Gleitkommazahl darstellen. Ich muss diese Gleitkommazahl in ein double
extrahieren.
Der naive Double.parseDouble(new String(buf, i, j - i))
erledigt die Aufgabe. Allerdings wird hier viel Zeit verbracht und viele Speicherzuweisungen erfolgen, wahrscheinlich weil:
new String()
ein neues Objekt erstellt, ein interneschar[]
Array erstellt und die Zeichen in das Array kopiert;Double.parseDouble()
erstellt einFloatingDecimal
Objekt und erstellt auch einchar[]
Array, wobei die Zeichen ebenfalls hineinkopiert werden.
All diese Zuweisungen und Kopiervorgänge sind nicht wirklich notwendig. Kann ich sie vermeiden?
Was ich wirklich möchte, ist eine strtod
-ähnliche Funktion, die ein char[]
(oder ein byte[]
) sowie Start-/End-Offsets akzeptiert und einen double
zurückgibt.
Irgendwelche Vorschläge? Sollte ich meine eigene Lösung entwickeln? Sollte ich einen JNI-Wrapper um strtod
schreiben? Sollte ich eine bereits vorhandene Java-Bibliothek verwenden?