Mit GWT (Google Web Toolkit) lässt es
sich für einen Java-Programmierer gut programmieren. Die bekannten
Java-Klassen sind dort größtenteils vorhanden, die bekannten
Algorithmen lassen sich meistens verwenden, doch wenn das Programm
dann ausgeführt wird, kommt manchmal die Enttäuschung bezüglich
der Geschwindigkeit. Die Umgebung ist deutlich anders, der Java-Code
wird nicht in den Byte-Code einer virtuellen Maschine übersetzt,
sondern nach JavasScript. JavaScript erreicht nicht die
Geschwindigkeit des Byte-Codes, aber was wesentlich mehr ins Gewicht
fällt: Die Tücken liegen an ganz anderer Stelle. Was in Java
ansonsten performant ist, kann in JavaScript überraschend langsam
sein.
Bevor das Programm getunt werden kann,
müssen erst einmal die Schwachstellen aufgedeckt werden. Dazu
braucht es ein Tool zur Performancemessung, also ein Tool, welches
anzeigen kann wo wieviel Zeit verbraucht wurde.
Ich gehe auf zwei Tools ein:
- Google Speed Tracer
- Firebug mit der Zeitmessung
Speed Tracer werde ich nur kurz
behandeln, da Firebug das wesentlich geeignetere Tool ist.
1. Messungen mit Speed Tracer
Speed Tracer ist ein Plugin für
Chrome, welches von Google selbst entwickelt wird. Die Installation
wird auf
developers.google.com/web-toolkit/speedtracer gut
beschrieben.
Sehen wir uns mal eine solche Grafik
an:
Man erkennt sofort, dass sich das
Programm zu 99,8% im JavaScript Callback befindet. Gleichzeitig ist
dies die einzige verwertbare Information, die Speed Tracer in diesem Beispiel liefert.
Als Programmiererin, sie ich das Programm selbst geschrieben habe,
weiß ich das aber auch, schließlich kenne ich ja meinen Code.
Viel interessanter ist, in welchen
Funktionen wie viel Rechenzeit verbracht wird. Diese Information kann
Speed Tracer – soweit ich weiß – nicht bieten. Firebug kann das
aber, und daher leite ich gleich dazu über.
2. Messungen mit Firebug
Firebug ist das
Entwickler-Tool für den Firefox. Es bietet in der Konsole u. A. eine
Zeitmessung auf der Ebene von JavaScript-Funktionen.
Damit uns die Ausgaben von Firebug
nutzen, müssen wir GWT dazu bringen, lesbare Methodennamen in
JavaScript zu generieren. Dies geht ganz leicht, indem wir beim
GWT-Compilieren den „Output Style” auf „Pretty” setzen.
Jetzt gehen wir in den Firebug.
Eventuell muss dort unter „Skript” das JavaScript neu laden.
Anschließend können wir im Punkt „Konsole” über „Zeitmessung”
unsere Messung nach Belieben ein- und ausschalten.
Durch einen Klick auf die Spaltenüberschrift kann das Ergebnis sortiert werden. Am sinnvollsten ist eine Sortierung nach Prozent.
Schauen wir nur auf die ersten fünf Funktionen, da dort die meiste Rechenzeit verbraucht wird. Als Programmierer weiß ich, dass die
Funktionen istErlaubt() und pr() von mir stammen. Die ersten drei
Funktionen wrapArray(), initDims_0 und arraycopy() kommen aber scheinbar
aus der GWT Bibliothek. Da sie zusammen 46% der Rechenzeit (dritte
Spalte) verbrauchen, ist dies ein Grund, sie genauer anzuschauen.
(Bei einer anderen Anwendung werden es natürlich ganz andere
Funktionen sein, die vorne mit dem größten Zeitverbrauch stehen.)
Zum Untersuchen der Funktionen öffnen
wir die Datei, die in der letzten Zeile angegeben ist. Bei unseren
eigenen Funktionen können wir dort den von GWT erzeugten Code
anschauen und überlegen, wo Verbesserungspotential ist. Bei den
Bibliotheksfunktionen bringt das nichts, da wir deren Code nicht
ändern können. Wir können uns aber anschauen, wo in unserem Code
diese Funktionen direkt oder indirekt aufgerufen.
In dem Beispiel sind die drei am
meisten aufgerufenen Funktionen bei der Erzeugung von Arrays
beteiligt. Das lässt vermuten, dass ich in meinem Code ein
Performanceproblem mit Arrays habe.
Wie dieses angegangen und der Code
optimiert werden kann, werde ich im nächsten Beitrag meines Blogs
zeigen.
Keine Kommentare:
Kommentar veröffentlichen