Wie test der render-Geschwindigkeit in Eckige
Wir bauen ein Angular-app, und wir versuchen herauszufinden, wie man einige benchmarks auf, wie lange es dauert zum Rendern von verschiedenen Seiten. Ich habe gelesen, über performance.timing
hier, aber das ist wohl nur sinnvoll, mit nicht-single-page-Applikationen, wie wenn ich navigieren, um neue Ansichten in unserer app, die timing-zahlen nicht ändern.
Im Idealfall wären wir in der Lage, fügen Sie einige code, der bekommt render-Zeit für verschiedene Ansichten und Beiträge es in unserer Big Query service.
Irgendwelche Ideen auf, wie man einige timing-Informationen für Ansichten in einer Angular-app?
EDIT:
Genauer gesagt, Sie gehen, um eine route, die lädt eine große ng-repeat-Liste (die ist nicht optimal für Leistung), und das Fenster hat eine lange Verzögerung, bevor es tatsächlich macht der Elemente in der Liste. Wir würden gerne sehen, wie lange es dauert, um von der großen leere Ansicht für das rendering der Elemente in der Liste.
- Was genau möchtest du Messen? Es gibt einige built-in Veranstaltungen draußen wie
$routeChangeStart
und$routeChangeSuccess
. Vielleicht könnten Sie, abonnieren Sie Sie, und verwenden Sie die User-Timing-API, um die Aufzeichnung des Timings. - Ich werde sehen, was genau diese Ereignisse erfassen. Ich fügte hinzu, ein edit oben mit mehr Einzelheiten.
- vielleicht ähneln - stackoverflow.com/a/1975103/104380
- Durch Ihre Referenz, die ich gefunden
$viewContentLoaded
was könnte das sein, was ich Suche! - Immer noch ungelöst.
$viewContentLoaded
feuert sofort, wenn wir gehen, um eine route statt, wenn der Inhalt tatsächlich gerendert wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach etwas Experimentieren, fand ich einen Weg, um eine Annäherung, wie lange eine view gerendert.
Szenario:
ng-repeat
ul
In einer Angular-app
ng-repeat
ist ein notorischer performance-killer, aber es ist extrem bequem. Hier ist eine Diskussion über die Leistung und hier.Sagen wir, wir möchten Holen Sie sich ein Näherungswert für die Zeit, die es dauert, um von #3 bis #4, Test der AJAX-call performance ist ziemlich einfach.
Hier ist etwas Kontext:
Und innerhalb der Eckigen controller:
Genannten Ereignisse durch @runTarm,
$routeChangeStart
,$routeChangeSuccess
, und$viewContentLoaded
ausgelöst werden, sobald die route geladen ist, aber bevor der DOM macht der Elemente, so lösen Sie nicht das Problem. Aber durch Experimentieren fand ich, dass, sobald die AJAX-callback beendet und setzt$scope.items
-, Winkel beginnt eine blockierende operation der Verarbeitungitems
und Vorbereitung derng-repeat
ul
eingefügt werden, in der DOM. Also, wenn du die Zeit nach deinem AJAX-Aufruf beendet, und die Zeit, wieder in einsetTimeout
angegeben in der callback, dersetTimeout
Rückruf in der Warteschlange zu warten, bis Winkel erfolgt mit dem repeater und Sie bekommen die Zeit, die ein Bruchteil einer Sekunde, bevor der DOM macht, so dass Sie die nächste Näherung für die rendering-Zeit. Es werden nicht die tatsächlichen render-Zeit, aber der langsame Teil für uns ist nicht die DOM tun, es ist Arbeit, aber Eckig, was ist das, was wir suchen, um zu Messen.Hier ist die überarbeitete Beispiel:
Typoskript /Winkel (2+) Antwort:
Benchmark für die Zeit, in Winkel-die rendering-Komponente Baum, Messen Sie vor und nach dem change detection). Dies wird die Zeit, wie lange es dauert, Winkel erstellen, alle untergeordneten Komponenten und bewerten
ngIf
s /ngFor
s usw.Manchmal, wenn change-detection läuft, wird sich nichts geändert haben und die festgelegten Intervall wird kleiner. Schau einfach nach dem längsten Zeitintervall und das ist wahrscheinlich, wo die ganze Arbeit passiert. Auch, am besten zu verwenden OnPush-change-detection-Strategie. Sehen http://blog.angular-university.io/onpush-change-detection-how-it-works/
Erklären, dass diese Timer-Dienstprogramm über Ihre
@Component({...}) class
:Fügen Sie diese innen Ihrer Komponentenklasse:
Beachten Sie, dass Winkel-rendering ist getrennt von der browser rendering (Malerei) auf dem Bildschirm. Das braucht Zeit, auch. Wenn Sie sehen, javascript (gelb) mit einer Menge von "checkAndUpdateView" und "callViewAction" Anrufe in der Chrome-Timeline-Tool (javascript-developer-Konsole -> Leistung -> record), Eckig Rendern passiert. Wenn Sie sehen, lila in der Chrome-Timeline-Tool, gekennzeichnet mit "rendering", dass die tatsächliche browserdarstellung.
Versuchen, mit dem open-source-Chrome-plugin Winkel-performance monitor können Sie die digest-Zeit in Eckige Anwendungen: https://github.com/Linkurious/angular-performance