Jak zmierzyć wydajność cyklu podsumowania mojej aplikacji AngularJS?

82

Jaki jest prosty sposób na zmierzenie czasu trwania cyklu podsumowania angularjs? Istnieją różne metody analizy wydajności cyklu podsumowania, jednak każda ma swoje własne pułapki:

  • Chrome Profiler: zbyt wiele szczegółów nie rozkłada cyklu podsumowania w łatwy do znalezienia sposób
  • Batarang (wtyczka do przeglądarki AngularJS): Zbyt duży narzut, niska częstotliwość odświeżania, eksploduje przy dużych aplikacjach.

... musi być lepszy sposób?! 1?

Gil Birman
źródło

Odpowiedzi:

148

Oto sekret. W narzędziach Chrome dla programistów uruchom profil procesora. Po zakończeniu przechwytywania u dołu ekranu znajduje się trójkąt w dół obok opcji „Ciężki (oddolny)”. Kliknij trójkąt i wybierz „Flame Chart”. Gdy jesteś w trybie Flame Chart, możesz powiększać i przesuwać, aby zobaczyć cykle podsumowania, czas ich trwania i dokładnie, jakie funkcje są wywoływane. Wykres płomienia jest niezwykle przydatny do śledzenia problemów z ładowaniem stron, problemów z powtarzaniem ng, problemów z cyklem trawienia! Naprawdę nie wiem, jak udało mi się debugować i profilować przed wykresem płomienia. Oto przykład:

Flame Chart w narzędziach deweloperskich Chrome

aet
źródło
10
Dzięki. Właśnie go wypróbowałem i wydaje się bardzo przydatne. Czy możesz opublikować krótkie wideo demonstracyjne, w jaki sposób możesz go użyć w witrynie, aby wykryć i naprawić problem z wydajnością? To byłoby bardzo interesujące. Dzięki jeszcze raz.
Soferio
3
Wygląda na to, że nazywa się to „wykresem” i wygląda nieco inaczej w bieżącej (w. 51.0) wersji Chrome.
Marc Stober
Google wydało szczegółowy samouczek z krótkimi viudeos: developers.google.com/web/tools/chrome-devtools/ ...
Vaiden
41

Następująca odpowiedź powie ci bezczynną wydajność pętli $ digest, tj. Wydajność podsumowania, gdy żadne z wyrażeń obserwujących się nie zmieni. Jest to przydatne, jeśli aplikacja działa wolno, nawet jeśli widok się nie zmienia. W przypadku bardziej złożonych sytuacji zapoznaj się z odpowiedzią aet.


Wpisz w konsoli:

angular.element(document).injector().invoke(function($rootScope) { 
  var a = performance.now(); 
  $rootScope.$apply(); 
  console.log(performance.now()-a); 
})

Wynik poda czas trwania cyklu podsumowania w milisekundach. Im mniejsza liczba, tym lepiej.


UWAGA:

Domi zauważył w komentarzach: angular.element(document) niewiele da, jeśli użyjesz ng-appdyrektywy do inicjalizacji. W takim przypadku ng-appzamiast tego pobierz element. Np. Robiącangular.element('#ng-app')

Możesz też spróbować:

angular.element(document.querySelector('[ng-app]')).injector().invoke(function($rootScope) { 
  var a = performance.now(); 
  $rootScope.$apply(); 
  console.log(performance.now()-a); 
})
Gil Birman
źródło
W tym przypadku nic się nie zmienia, więc obserwatorzy nie biegają, nic nie jest ponownie oceniane itp. Nie dostajesz „prawdziwych” liczb.
lepszy oliver
2
Oczywiście są to liczby „prawdziwe”. Nie masz racji, wykonując $ rootScope. $ Apply () ponownie ocenia wszystkich obserwatorów, aby dowiedzieć się, czy się zmienili (w przeciwnym razie skąd Angular wiedziałby, że nic się nie zmieniło?).
Gil Birman
Może mamy na myśli coś innego, więc po prostu przytoczyć dokumenty: The listener is called only when the value from the current watchExpression and the previous call to watchExpression are not equal. Twój kod nie bierze pod uwagę żadnych słuchaczy. A angular tworzy wielu słuchaczy. Nigdy nie zadzwoniłbyś, $apply()gdyby nic się nie zmieniło, dlatego twoje wyniki mówią tylko połowę historii. W zależności od okoliczności może być mniej interesujący;)
lepszy oliver
1
Wyobraź sobie: masz 1000 wyrażeń obserwujących, wszystkie z nich zostaną ocenione, ale w rezultacie jeden „słuchacz” zostanie uruchomiony. Czy bardziej interesuje cię sposób działania zegarka, czy słuchacze?
Gil Birman
1
angular.element(document)nie przyniesie wiele, jeśli użyjesz ng-appdyrektywy do inicjalizacji. W takim przypadku pobierz ng-appzamiast tego element. Np. Robiąc angular.element('#ng-app')...
Domi
14

Możesz także użyć wydajności kątowej

To rozszerzenie zapewnia wykresy monitorowania w czasie rzeczywistym liczby obserwatorów, czasu podsumowania i szybkości podsumowania. Otrzymujesz również rozkład czasu podsumowania, dzięki czemu możesz dostrzec wyjątkowo długi czas podsumowania z bardziej rekurencyjnych paternów, a wszystkie dane w czasie rzeczywistym są powiązane ze zdarzeniami, dzięki czemu możesz określić, które akcje zmieniły wydajność aplikacji. Na koniec możesz określić czas metody usług i policzyć ich wykonanie, aby określić te, które mają większy wpływ na czas działania Twojej aplikacji.

Zrzut ekranu wydajności Angular

Disclamer: Jestem autorem rozszerzenia

Nicolas Joseph
źródło
Zainstalowałem go, ale nie wymyśliłem, jak go używać. Czy Twoje rozszerzenie dodało funkcje do profilera Chrome? Dzięki.
gm2008
Po otwarciu narzędzi programistycznych powinieneś mieć zakładkę „Kątowa” z tym widokiem.
Nicolas Joseph
Dzięki za odpowiedź. Aby pomyślnie zbudować rozszerzenie, muszę również zainstalować Python, VCBuild.exe, Windows SDK. Może mógłbyś coś dodać do swojej instrukcji.
gm2008
Jestem pod Mac OsX, więc nie mam pojęcia, co jest potrzebne w systemie Windows. Może mógłbyś wysłać żądanie ściągnięcia do repozytorium, aby opisać, co zrobiłeś. Dzięki za informację !
Nicolas Joseph
co robi „Function Timing”? Wpisałem nazwy modułów, ale wydaje się, że nic się nie dzieje.
raoel
5

Jedno przydatne narzędzie do monitorowania cyklu podsumowania można znaleźć w doskonałym narzędziu ng-stats autorstwa @kentcdodds . Tworzy taki mały element wizualny i można go nawet wdrożyć za pomocą bookmarkletu. Można go nawet używać wewnątrz ramek iFrame, takich jak jsfiddle.

dobry cykl trawienia wprowadź opis obrazu tutaj

Niewielkie narzędzie do wyświetlania statystyk dotyczących kątowego podsumowania / zegarków Twojej strony. Ta biblioteka ma obecnie prosty skrypt do tworzenia wykresów (patrz poniżej). Tworzy również moduł o nazwie, angularStatsktóry zawiera dyrektywę o nazwie, angular-stats która może być użyta do umieszczenia statystyk kątowych w określonym miejscu na stronie, które określisz.

Znaleziono pod adresem https://github.com/kentcdodds/ng-stats

G.Mart
źródło
2

Możesz użyć UX Profiler

  • Widok transakcji użytkownika, czyli KLIKNIJ i wszystkie działania przez niego spowodowane (inne zdarzenia, XHR, przekroczenia czasu) zgrupowane razem.
  • Pomiary czasu (w odczuciu Użytkownika) całej Transakcji Użytkownika i / lub jej części.
  • Połączone asynchroniczne śledzenie stosu.
  • Focused Profiler - profiluj tylko problematyczne wydarzenie.
  • Integracja Angular 1.x.

wprowadź opis obrazu tutaj

Konstantin Triger
źródło
1

dla trybu ścisłego, jedno uruchomienie skrótu cucle, uruchom go w konsoli f12 w chrome

angular.element(document).injector().invoke(['$rootScope',function($rootScope) { var a = performance.now(); $rootScope.$apply(); return performance.now()-a; }])
Anatoli Klamer
źródło
0

narzędzia opisane powyżej dały Ci pomysł pomiaru wydajności pętli podsumowującej Większość ważnych punktów dla zwiększenia wydajności cyklu podsumowania to

  • Uważnie monitoruj zdarzenia przewijania, aby ukryć wszystkie niewidoczne elementy i
    znacznie zmniejszyć liczbę obserwatorów.

  • Miej możliwe do zarządzania cykle podsumowania $ dla wszystkich innych zdarzeń.

shailendra pathak
źródło