Morgen.
Ich habe Klassen zum Parsen einer GZIP-Datei und für die Dekompression zur Dekodierung von Deflate-Daten.
Beschrieben ist das ganze in den RFCs 1951 und 1952.
Das ganze funktioniert, das größte Problem ist aber, dass das ganze furchtbar lahm ist. Während gzip auf meinem alten 300MHz (vielleicht auch etwas mehr) Server mit Linux bei einer 4,5 MB-Datei für die Dekompression irgendwo im Bereich <200ms liegt, braucht mein Code dafür auf meinem 1,6 GHz-Notebook schon 2,7s. Auf meinem 2,66 GHz-PC braucht mein Programm schon um die 8s, auf meinem Server von vorhin noch einmal deutlich mehr.
Dabei habe ich schon alle möglichen Optimierungen versucht. Zuerst hatte ich einen Bitbaum, habe alle Bits einzeln eingelesen und dann über den Baum den Wert herausgefunden. Dann habe ich versucht, Bits zusammenzufassen, soweit möglich, und eine Tabelle aller Codes für jede Bitlänge anzulegen. Das hat aber so gut wie keine Verbesserung der Geschwindigkeit gebracht. Dann habe ich eine Tabelle aller Codes auf die Maximalanzahl von Bits ausgerichtet erstellt. Das hat schonmal eine deutliche Geschwindigkeitserweiterung gebracht, nämlich von 3,7s auf 2,7s. Das ist aber immer noch viel zu langsam.
Wie könnte man es noch weiter optimieren?
Ich habe ein Testprojekt als Anhang hochgeladen und eine .tar.gz-Datei zum Testen findet ihr
hier.
(Hinweis: Die .tar.gz-Datei im Beispielprojekt im Anhang ist eine andere als die, mit der ich die Zeitwerte oben gemessen habe. Die Datei im Anhang liegt bei meinem Notebook bei zwischen 3,9s und 5,1s.)