JSF und Struts auf dem Leistungsprüfstand

Das zweite Testszenario …

… führt bei den beiden JSF-Anwendungen eine weitere Managed Bean ein. Die Klasse PerformanceTestBean besitzt wieder eine Collection persons. Für die Durchführung des Bearbeitungsroundtrips gibt es zunächst die editTable.jsp, welche über die JSF-Komponente h:dataTable eine Tabelle erzeugt und die Collection persons über h:inputText-Komponenten darstellt. Des Weiteren existiert ein Submit-Button, über den die geänderten Daten zum Server geschickt, dort die Änderungen in den Person-Objekten aus persons durchgeführt und das Ergebnis mittels showTable.jsp wieder angezeigt wird. Die showTable.jsp enthält zu diesem Zweck eine h:dataTable-Komponente, allerdings diesmal mit h:outputText-Komponenten für die reine Anzeige.

Im zweiten Testszenario wird ein Vergleich der Performance zu Struts durchgeführt. Daher haben wir eine den JSF-Anwendungen ähnliche Struts-Anwendung erstellt. Diese besitzt anstelle der Managed Bean-Klasse die typische Struts-Action-Klasse EditPerformanceTestAction und eine Struts-Form-Bean-Klasse PerformanceTestFormBean. Die Datenbearbeitungs- und Anzeigemasken werden durch die JSP-Seiten editTable.jsp und showTable.jsp erzeugt. In diesen wird mit Struts Tags unter Zuhilfenahme von JSTL die Anzeige realisiert.

Für die Messungen wurde JMeter wieder ähnlich dem ersten Testszenario konfiguriert und erneut der Durchschnittswert aus 1000 Requests ermittelt. Neben der Performance für den Bearbeitungsrountrip haben wir auch noch Messungen für die reine Anzeige von unterschiedlich großen Tabellen durchgeführt. Die Messungen wurden in diesem Szenario für 3, 6 und 9 Spalten mit jeweils 20, 200 und 1000 Zeilen durchgeführt.

Testergebnisse

Beginnen wir mit der Betrachtung der Ergebnisse für unterschiedlich große Komponentenbäume. Abbildung 1 zeigt, dass sowohl bei RI als auch MyFaces die Zeiten linear zur Tiefe des Komponentenbaums sind. Leichte Vorteile kann hier RI verbuchen.

Abb. 1: Zeiten für Komponentenbäume unterschiedlicher Tiefe

Wie verhält es sich für diese Testanordnung nun mit dem Speicherbedarf? Abbildung 2 bringt hier Erstaunliches zutage: Der Speicherverbrauch der RI ist nicht nur um ein Vielfaches höher als bei MyFaces, sondern verhält sich auch anders: Während der Speicherverbrauch von MyFaces einigermaßen konstant bleibt, wächst der von RI massiv an, wenn die Seiten mehr Inhalt haben.

Abb. 2: Speicherverbrauch von RI und MyFaces

Dieses Verhältnis fällt sogar noch drastischer aus, wenn der Benutzer mehrfach die gleiche Seite öffnet. Die Ursache dafür liegt in der Verwaltung des so genannten ViewState bei RI 1.2: Hier wird der Zustand der Anzeige nicht nur für jede Seite über die ViewId, sondern auch für jedes Fenster über die WindowId in der Session vorgehalten.

Kommen wir nun aber zum Vergleich von JSF und Struts. Abbildung 3 zeigt hier einen Vorteil zugunsten von Struts, der etwa bei Faktor 8 liegt.

Abb. 3: Gegenüberstellung von Struts, MyFaces und RI (Teil 1)

Wenn wir nur die reine Anzeige von Tabellen betrachten, stellen wir immer noch fest, dass Struts etwa viermal so schnell ist wie die beiden JSF-Implementierungen (Abb. 4).

Abb. 4: Gegenüberstellung von Struts, MyFaces und RI (Teil 2)
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.