Messen Sie die Renderzeit einer JSF-Ansicht nach einer Serveranforderung

8

Ich möchte die Renderzeit einer JSF-Anwendung messen. Wegen meiner Machtgründe kann die Anwendung nicht mit Protokollen gefüllt werden.

Daher lautet meine Frage: Gibt es eine Möglichkeit, die Renderzeit der Anwendung nach einer bestimmten Aktion zu messen, die einen Back-End-Aufruf (Server) mit einem beliebigen Browser enthält?

Bisher habe ich nach der Verwendung der Chrome-Entwicklertools Folgendes festgestellt. Auf der Registerkarte "Netzwerk" wird für jede Anfrage die "Zeit" angezeigt. Außerdem wird nach der Auswahl eines bestimmten Eintrags auf der Registerkarte "Timing" eine detailliertere Visualisierung angezeigt. Nun, ich kann daraus das "Warten", dass die Rundreise zum Server hier erfasst wird, aber was ist mit der tatsächlichen Renderzeit.

Wenn angenommen wird, dass die gesamte Anfrage 1 Sek. dauerte und der Warteabschnitt 500 ms, kann ich ableiten, dass das Rendering die 1sec-500ms ist? Ich nehme nicht an, deshalb stelle ich diese Frage.

Lange Rede, kurzer Sinn, ich müsste aus dem Browser wissen, wie lange die Server-Verarbeitung dauerte und wie lange das eigentliche UI-Rendering dauerte.

Irgendwelche Tipps würden sehr geschätzt werden. Danke.

    
user2271933 13.10.2015, 15:02
quelle

1 Antwort

10

Sie können das mit einer benutzerdefinierten ViewDeclarationLanguage Methode tun Sie messen die createView() , buildView() , renderView() und ggf. restoreView() Methoden.

Hier ist ein Kickoff-Beispiel:

%Vor%

Um es zum Laufen zu bringen, erstellen Sie die folgende Fabrik:

%Vor%

Und registrieren Sie es wie folgt in faces-config.xml :

%Vor%

Der createView() ist der Schritt zum Erstellen der konkreten UIViewRoot -Instanz basierend auf <f:view> und <f:metadata> in den Ansichtsdateien. Bei der Verwendung von Facelets (XHTML) als Ansicht werden während dieses Schritts alle zugehörigen XHTML-Dateien vom SAX-Parser analysiert und für eine bestimmte Zeit zwischengespeichert, wie in javax.faces.FACELETS_REFRESH_PERIOD definiert. So kann es passieren, dass es einmal relativ langsam und das andere Mal blitzschnell ist.

Der buildView() ist der Schritt zum Auffüllen des JSF-Komponentenbaums ( getChildren() von UIViewRoot ) basierend auf der Ansichtszusammensetzung (XHTML). Während dieses Schritts werden alle Tag-Handler (JSTL und Freunde) ausgeführt und alle EL-Ausdrücke in diesen Tag-Handlern und die Attribute id und binding der Komponente ausgewertet (siehe auch JSTL in JSF2 Facelets ... macht Sinn? ). Wenn Backing-Beans also zum ersten Mal während der Erstellung der Ansicht erstellt werden und die Geschäftslogik während @PostConstruct aufgerufen wird, kann dies zeitaufwendig sein.

Der renderView() ist der Schritt zum Generieren der HTML-Ausgabe basierend auf dem JSF-Komponentenbaum und dem Modell, beginnend mit UIViewRoot#encodeAll() . Wenn Backing-Beans also zum ersten Mal während der Renderzeit der Ansicht erstellt werden und die Geschäftslogik während @PostConstruct aufgerufen wird, kann dies zeitaufwendig sein.

Wenn Backing-Beans in Getter-Methoden anstelle von @PostConstruct oder einem anderen einmalig vorkommenden Ereignis-Listener für den Lebenszyklus die Geschäftslogik falsch ausführen, kann dies dazu führen, dass dies noch mehr Zeit in Anspruch nimmt. Siehe auch Warum JSF Getter mehrmals aufruft .

    
BalusC 14.10.2015, 09:01
quelle