¿Cómo mido el rendimiento del ciclo de resumen de mi aplicación AngularJS?

82

¿Cuál es una forma sencilla de medir la duración del ciclo de resumen de angularjs? Existen varios métodos para analizar el rendimiento del ciclo de digestión, sin embargo, cada uno viene con sus propios pitfals:

  • Chrome Profiler: demasiados detalles, no desglosa el ciclo de resumen de una manera fácil de encontrar
  • Batarang (complemento del navegador AngularJS): demasiada sobrecarga, frecuencia de actualización lenta, explota con aplicaciones grandes.

... debe haber una mejor manera?! 1?

Gil Birman
fuente

Respuestas:

148

He aquí un secreto. En las herramientas de desarrollo de Chrome, ejecute un perfil de CPU. Una vez que haya dejado de capturar, en la parte inferior de la pantalla hay un triángulo hacia abajo junto a "Heavy (Bottom Up)". Haga clic en el triángulo y seleccione "Gráfico de llamas". Una vez que esté en el modo Flame Chart, puede hacer zoom y desplazarse para ver los ciclos de resumen, cuánto tardan y exactamente qué funciones se están llamando. Flame Chart es increíblemente útil para rastrear problemas de carga de páginas, problemas de rendimiento de repetición ng, problemas de ciclo de digestión. Realmente no sé cómo pude depurar y crear un perfil antes de Flame Chart. Aquí hay un ejemplo:

Flame Chart en las herramientas de desarrollo de Chrome

aet
fuente
10
Gracias. Solo lo probé y parece muy útil. ¿Puede publicar un breve video de demostración de cómo podría usarlo en un sitio para detectar y reparar un problema de rendimiento? Seria muy interesante. Gracias de nuevo.
Soferio
3
Esto parece llamarse simplemente "gráfico" y se ve un poco diferente en la versión actual (v. 51.0) de Chrome.
Marc Stober
Google ha lanzado un tutorial detallado con videos cortos: developers.google.com/web/tools/chrome-devtools/…
Vaiden
41

La siguiente respuesta le dirá el rendimiento inactivo del bucle $ digest, es decir, el rendimiento de digest cuando ninguna de las expresiones de su reloj cambia. Esto es útil si su aplicación parece lenta incluso cuando la vista no cambia. Para situaciones más complejas, consulte la respuesta de aet.


Escriba lo siguiente en la consola:

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

El resultado le dará la duración del ciclo de digestión, en milisegundos. Cuanto menor sea el número, mejor.


NOTA:

Domi señaló en los comentarios: angular.element(document) no rendirá mucho si usó la ng-appdirectiva para la inicialización. En ese caso, obtenga el ng-appelemento en su lugar. Ej. Haciendoangular.element('#ng-app')

También puedes probar:

angular.element(document.querySelector('[ng-app]')).injector().invoke(function($rootScope) { 
  var a = performance.now(); 
  $rootScope.$apply(); 
  console.log(performance.now()-a); 
})
Gil Birman
fuente
Nada cambia en este caso, por lo que ningún observador corre, nada se reevalúa, etc. No se obtienen números "reales".
un mejor oliver
2
Por supuesto que son números "reales". Es incorrecto, al hacer $ rootScope. $ Apply () reevalúa a todos sus observadores para averiguar si han cambiado (de lo contrario, ¿cómo sabría angular que nada ha cambiado?).
Gil Birman
Tal vez nos referimos a algo diferente, por lo que sólo citamos los documentos: The listener is called only when the value from the current watchExpression and the previous call to watchExpression are not equal. Su código no tiene en cuenta a ningún oyente. Y angular crea muchos oyentes. Nunca llamarías $apply()cuando nada ha cambiado, por lo que tus resultados solo cuentan la mitad de la historia. Dependiendo de las circunstancias puede ser la menos interesante;)
un mejor oliver
1
Imagínese esto: tiene 1000 expresiones de observación, todas serán evaluadas, pero un "oyente" se activará como resultado. ¿Está más preocupado por el rendimiento de la expresión del reloj o por los oyentes?
Gil Birman
1
angular.element(document)no rendirá mucho si usó la ng-appdirectiva para la inicialización. En ese caso, obtenga el ng-appelemento en su lugar. Por ejemplo, haciendo angular.element('#ng-app')...
Domi
14

También puede usar rendimiento angular

Esta extensión proporciona gráficos de monitoreo en tiempo real del número de observadores, tiempo de resumen y tasa de resumen. También obtiene la distribución de tiempo de resumen para que pueda distinguir tiempos de resumen excepcionalmente largos a partir de patrones más recursivos y todos los datos en tiempo real están vinculados a eventos para que pueda determinar qué acciones cambiaron el rendimiento de la aplicación. Finalmente, puede cronometrar el método de los servicios y contar su ejecución para determinar cuáles tienen el mayor impacto en el tiempo de ejecución de su aplicación.

Captura de pantalla de rendimiento angular

Descargo de responsabilidad: soy el autor de la extensión

Nicolas Joseph
fuente
Lo instalé, pero no he descubierto cómo usarlo. ¿Tu extensión ha agregado funciones al generador de perfiles de Chrome? Gracias.
GM2008
Cuando abres las herramientas de desarrollo, deberías tener una pestaña "Angular" con esa vista.
Nicolas Joseph
Gracias por responder. Para construir la extensión con éxito, también necesito instalar Python, VCBuild.exe, Windows SDK. Quizás podrías agregar a tu manual.
GM2008
Estoy bajo Mac OsX, así que no tengo idea de lo que se necesita para Windows. Tal vez podría hacer una solicitud de extracción en el repositorio para describir lo que ha hecho. Gracias por la info !
Nicolas Joseph
¿Qué hace "Función de sincronización"? Ingresé algunos nombres de módulos pero no parece que suceda nada.
raoel
5

Se puede encontrar una herramienta útil para vigilar el ciclo de resumen a través de la excelente herramienta ng-stats de @kentcdodds . Crea un pequeño elemento visual como este, e incluso se puede implementar a través de bookmarklet. Incluso se puede usar dentro de iFrames como jsfiddle.

buen ciclo de digestión ingrese la descripción de la imagen aquí

Poca utilidad para mostrar estadísticas sobre el resumen angular / relojes de su página. Esta biblioteca tiene actualmente un script simple para producir un gráfico (ver más abajo). También crea un módulo llamado angularStatsque tiene una directiva llamada angular-stats que se puede usar para colocar estadísticas angulares en un lugar específico de la página que especifique.

Encontrado en https://github.com/kentcdodds/ng-stats

G.Mart
fuente
2

Puedes usar UX Profiler

  • Vista de transacciones de usuario, es decir, CLIC y toda la actividad causada por ella (otros eventos, XHR, tiempos de espera) agrupados.
  • Mediciones de tiempo (como el Usuario lo siente) de toda la Transacción del Usuario y / o sus partes.
  • Seguimiento de pila asincrónico combinado.
  • Perfilador enfocado: perfile solo el evento problemático.
  • Integración angular 1.x

ingrese la descripción de la imagen aquí

Konstantin Triger
fuente
1

para el modo estricto, una ejecución de digest cucle, ejecútelo en la consola f12 en chrome

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

Las herramientas descritas anteriormente ya le dieron la idea de medir el rendimiento del ciclo de resumen Los puntos más importantes para aumentar el rendimiento del ciclo de resumen son

  • Supervise de cerca los eventos de desplazamiento para ocultar todos los elementos invisibles y
    reducir en gran medida el número de observadores.

  • Tenga ciclos de $ digest manejables para todos los demás eventos.

Shailendra Pathak
fuente