Freitag, 14. Juni 2013

Performancemessung mit GWT

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:
  1. Google Speed Tracer
  2. 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.

Einmal installiert kann Speed Tracer jederzeit durch einen Klick auf das kleine grüne Symbol einfach gestartet werden und produziert Grafiken, die hübsch anzusehen sind, leider jedoch wenig für uns geeignete Informationen bieten.
 
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.

Nach getaner Arbeit erhalten wir ein Protokoll wie das Folgende:

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