2014-04-14 5 views
76

Qual è un modo semplice per misurare la durata del ciclo di digest angularjs? Esistono vari metodi per analizzare le prestazioni del ciclo digest, ma ciascuno dotato di propri pitfals:Come misuro le prestazioni del ciclo di digest dell'app della mia AngularJS?

  • Chrome Profiler: troppi dettagli, non abbattere il ciclo digest in un facile da trovare modo
  • Batarang (plug-in del browser AngularJS): troppo sovraccarico, bassa frequenza di aggiornamento, esplode con app di grandi dimensioni.

... ci deve essere un modo migliore?! 1?

risposta

140

Ecco un segreto. Negli strumenti di chrome dev, eseguire un profilo cpu. Dopo aver interrotto l'acquisizione, nella parte inferiore dello schermo si trova un triangolo in basso accanto a "Pesante (dal basso verso l'alto)". Fare clic sul triangolo e selezionare "Flame Chart". Una volta che sei in modalità Flame Chart, puoi ingrandire e fare una panoramica per vedere i cicli digest, quanto tempo impiegano e esattamente quali funzioni vengono chiamate. Il Flame Chart è così incredibilmente utile per rintracciare i problemi di caricamento della pagina, problemi di prestazioni ng-repeat, problemi del ciclo digest! Non so davvero come sia stato possibile eseguire il debug e il profilo prima del Flame Chart. Ecco un esempio:

Flame Chart in Chrome dev tools

+10

Grazie. Ho appena provato e sembra molto utile. Sei in grado di pubblicare un breve video dimostrativo di come potresti usarlo su un sito per rilevare e riparare un problema di prestazioni? Sarebbe molto interessante. Grazie ancora. – Soferio

+2

Questo sembra essere chiamato "grafico" e sembra un po 'diverso nella versione attuale (v. 51.0) di Chrome. –

37

La seguente risposta indicherà la prestazione inattiva del ciclo $ digest, ad esempio, le prestazioni del digest quando nessuna delle espressioni di visualizzazione cambia. Questo è utile se la tua applicazione sembra lenta anche quando la vista non cambia. Per situazioni più complesse, vedere la risposta di Aet.


Digitare il seguente nella console:

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

Il risultato vi darà la durata del ciclo di digest, in millisecondi. Più piccolo è il numero, meglio è.


NOTA:

Domi notato nei commenti: angular.element(document) non si produrrà più se è stato utilizzato la direttiva ng-app per l'inizializzazione. In tal caso, prendi invece l'elemento ng-app. Per esempio. facendo angular.element('#ng-app')

Potete anche provare:

angular.element(document.querySelector('[ng-app]')).injector().invoke(function($rootScope) { 
    var a = performance.now(); 
    $rootScope.$apply(); 
    console.log(performance.now()-a); 
}) 
+0

non cambia nulla in questo caso, quindi non gestiscono osservatori, nulla è rivalutato etc.Non ottieni numeri "reali". – zeroflagL

+2

Ovviamente sono numeri "reali". Non sei corretto, facendo $ rootScope. $ Apply() rivaluta tutti i tuoi osservatori per scoprire se sono cambiati (altrimenti come sarebbe angolare sapere che nulla è cambiato?). –

+0

Forse intendiamo qualcosa di diverso, quindi cito semplicemente i documenti: 'Il listener è chiamato solo quando il valore dall'espressione watch corrente e la precedente chiamata a watchExpression non sono uguali'. Il tuo codice non tiene conto degli ascoltatori. E angolare crea molti ascoltatori. Non chiameresti mai '$ apply()' quando nulla è cambiato, quindi i tuoi risultati dicono solo metà della storia. A seconda delle circostanze potrebbe essere la meno interessante;) – zeroflagL

21

Qui è un nuovo strumento che ho scoperto che aiuta a digerire profiling: Digest-HUD

enter image description here

+0

Ecco un fork senza la dipendenza jquery non menzionata: https://github.com/mstrutt/digest-hud/tree/feature/no-jquery – mtfurlan

+0

Si prega di aprire un PR contro il repository originale, sarei felice di unire questo in! – Piotr

12

Si potrebbe anche usare angular-performance

Questo estensione fornisce grafici di monitoraggio in tempo reale del numero di osservatori , tempo di digestione g e tasso di digestione.È inoltre possibile ottenere la distribuzione del tempo di digitazione in modo che sia possibile distinguere i tempi più lunghi da digerire ricorsivo e tutti i dati in tempo reale sono collegati agli eventi in modo da poter determinare quali azioni hanno modificato le prestazioni dell'applicazione . Infine, puoi utilizzare il metodo dei servizi orari e contare la loro esecuzione per determinare quelli che hanno un impatto maggiore sul tempo di esecuzione della tua app.

Angular performance screenshot

Disclamer: Io sono l'autore dell'estensione

+0

L'ho installato, ma non ho capito come usarlo. La tua estensione ha aggiunto funzioni al profiler di Chrome? Grazie. – gm2008

+0

Quando apri gli strumenti per sviluppatori, dovresti avere una scheda "Angolare" con quella vista su di essa. –

+0

Grazie per la risposta. Per costruire con successo l'estensione, ho anche bisogno di installare Python, VCBuild.exe, Windows SDK. Forse potresti aggiungere al tuo manuale. – gm2008

2

È possibile utilizzare UX Profiler

  • User vista transazione, cioè CLICCA e tutta l'attività causate da esso (altri eventi , XHRs, Timeouts) raggruppati insieme.
  • Misurazioni del tempo (come l'utente lo ritiene) dell'intera transazione utente e/o delle sue parti.
  • Traccia stack asincrona combinata.
  • Focused Profiler - profilo solo l'evento problematico.
  • Integrazione 1.x angolare.

enter image description here

-1

gli strumenti sopra descrivono già ti ha dato l'idea di misurare le prestazioni della digerire anello La maggior parte dei punti 'importanti per aumentare le prestazioni di digerire ciclo sono

  • Monitor strettamente scorrere gli eventi per nascondere tutti gli elementi invisibili e
    ridurre notevolmente il numero di osservatori.

  • Sono gestibili cicli di digestione $ per tutti gli altri eventi.

0

per la modalità rigorosa, una gestione di digerire cucle, eseguirlo in console F12 in cromo

angular.element(document).injector().invoke(['$rootScope',function($rootScope) { var a = performance.now(); $rootScope.$apply(); return performance.now()-a; }]) 
4

Uno strumento utile per tenere d'occhio il ciclo digest possono essere trovati tramite l'eccellente ng-stats tool da @kentcdodds. Crea un piccolo elemento visivo in questo modo e può anche essere implementato tramite bookmarklet. Può anche essere usato all'interno di iFrame come jsfiddle.

good digest cycleenter image description here

piccola utility per mostrare statistiche circa della tua pagina angolari digest/orologi. Questa libreria ha attualmente un semplice script per produrre un grafico (vedi sotto). Crea anche un modulo chiamato angularStats che ha una direttiva denominata angular-stats che può essere utilizzata per inserire statistiche angolari in un punto specifico della pagina specificata.

Trovato in https://github.com/kentcdodds/ng-stats

Problemi correlati