Identificar problemas de desempeño en la aplicación Bad Bunch
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Demostrar diferentes formas de regular el desempeño.
- Usar el monitor de desempeño para ubicar problemas del nodo DOM.
Llamadas de evento demasiado costosas
En la unidad anterior, solucionamos problemas de un componente web Lightning con mal desempeño y mala ubicación del código en un bucle. Veamos otro mal ejemplo y la forma de solucionar el problema.
- Con la aplicación Bad Bunch abierta, seleccione Example 2: Scroll List (Ejemplo 2: Desplácese por la lista) y espere que la página se cargue por completo.
- En el panel DevTools Performance (Desempeño de DevTools), haga clic en
para empezar a registrar un perfil.
- Ahora desplácese por la lista en Scroll This List! (Desplazarse por la lista).
Debería ser un poco lento o entrecortado.
- En el panel Performance (Desempeño), haga clic en Stop (Detener) para finalizar el registro y permitir que se compilen los datos.
Busque en la sección Main (Principal) todos los eventos de JavaScript que se están llamando. Observe los pequeños triángulos rojos.
Es la forma que tiene Chrome de indicar que el proceso podría estar tardando demasiado.
- Baje por la pila de llamadas y haga clic en los eventos onScroll para obtener los detalles en la ficha Summary (Resumen).
Como verá, provienen de nuestro código, el método onScroll en el archivo example2_ScrollList.js. En la línea 87, para ser precisos.
- En el panel Summary (Resumen), haga clic en el vínculo a example2_ScrollList.js para ir al panel Sources (Fuentes) y visualizar el código.
Observe la línea 82:li.style.background = ‘#edede’;
.
Con cada desplazamiento, agregamos estilos con código. Esto es algo que se debería manejar de otra manera. Le agrega demasiada sobrecarga al evento. Existen pseudoclases de CSS (hojas de estilo en cascada), como tr:nth-child(even) y tr:nth-child(odd) para este propósito en particular. Un enfoque de CSS siempre será más rápido que usar JavaScript.
Otro problema que hay aquí es la falta de un controlador de frecuencia de eventos para evitar que el evento se active tan a menudo. Agregar un agente de escucha a un evento de desplazamiento generará la activación de una enorme cantidad. Si ese evento realiza operaciones costosas, es peor aún. Consulte la sección Recursos para obtener más información al respecto.
Representación de estilos recalculados
- Con la aplicación Bad Bunch abierta, seleccione Example 3: Input Fields (Ejemplo 3: Campos de entrada).
Para este ejemplo, es probable que necesite regular la CPU.
- En Capture Settings (Configuración de captura) (
), para CPU, seleccione 4x slowdown si quiere mostrar un navegador más lento.
Observe el ícono de advertencia junto a Performance (Desempeño) y el ícono rojo de Capture Settings (Configuración de captura) configurados como recordatorios de que la pantalla está regulada. La regulación se relaciona con las capacidades de su computadora. Por ejemplo, la opción 4x slowdown (Reducir la velocidad 4 veces) hace que su CPU funcione 4 veces más lento que su capacidad habitual.
- En el panel DevTools Performance (Desempeño de DevTools), haga clic en
.
- Para empezar, escriba Input #1 (Entrada n.º 1).
Es una experiencia compleja, para nada fluida.
- Comience a escribir en Input #2 (Entrada n.º 2). Mucho más fluido.
- En el panel Performance (Desempeño), haga clic en Stop (Detener) para finalizar el registro y permitir que se compilen los datos.
El gráfico de CPU muestra mucho en color púrpura. Si consultamos la ficha Summary (Resumen), vemos que el color morado indica Rendering (Representación). Gran parte del tiempo se destina a la representación. También hay muchos triángulos de color rojo.
Ampliemos solo una pequeña sección. Sin embargo, primero, desactivemos la regulación de la CPU.
- En Capture Settings (Configuración de captura) (
), desactive la regulación de la CPU.
Recomendamos desactivar toda regulación en cuanto termine de usarla, ya que continúa ejecutándose incluso cuando ya se detuvo el registro.
- Haga clic y arrastre el mouse por una sección pequeña del gráfico de CPU.
Observe el bloque grande Recalculate Style (Recalcular estilo). Algo está ocasionando un nuevo cálculo costoso de los estilos CSS.
- Haga clic en uno de los eventos onSlowInput para obtener los detalles en el panel Summary (Resumen).
- En el panel Summary (Resumen), haga clic en el vínculo example3_InputFields.js para abrirlo en el panel Sources (Fuentes).
El método onSlowInput hace una llamada al método de bloqueo. El método de bloqueo representa unos cuantos elementos div de tamaños aleatorios que hacen que los estilos se tengan que recalcular. Eso es un problema.
El método onFastInput, línea 166, es llamado desde el campo Input #2 (Entrada n.º 2). También realiza una llamada a la llamada de bloqueo, pero solo después de pasar por el controlador de frecuencia de eventos. Esto muestra cómo ayuda ese controlador. La práctica recomendada sería usar el controlador de frecuencia de eventos y actualizar el método de bloqueo para evitar ocasionar el nuevo cálculo.
Explosión del nodo DOM
El siguiente ejemplo puede hacer que el navegador quede inmovilizado. Puede usar el Administrador de tareas mencionado en la primera unidad para volver a empezar.
- Con la aplicación Bad Bunch abierta, seleccione la ficha Example 4: Table (Tabla).
Si el navegador queda inmovilizado, finalice el proceso con el Administrador de tareas de Chrome y empiece de nuevo.
Son muchos datos, pero deberían cargarse rápido. Registremos un perfil mientras se carga la página.
- Haga clic en Example 3: Input Fields (Ejemplo 3: Campos de entrada) para mover esta ficha.
- En el panel DevTools Performance (Desempeño de DevTools), haga clic en
.
- Ahora, haga clic en Example 4: Table (Ejemplo 4: Tabla).
Espere que se cargue.
- En el panel Performance (Desempeño), haga clic en Stop (Detener) para finalizar el registro y permitir que se compilen los datos.
Si registra varios perfiles, puede cambiar entre un registro y otro en el menú Performance (Desempeño).
Al desplazarse por la pila de llamadas de la sección Main (Principal), parecerá que un evento renderedCallback se ejecutó varias veces, aunque en realidad lo hizo una sola vez.
- Haga clic en el evento renderedCallback para obtener los detalles en el panel Summary (Resumen).
- En el panel Summary (Resumen), haga clic en el vínculo example4_Table.js para abrirlo en el panel Sources (Fuentes).
Están pasando muchas cosas en este método. Si profundiza descubrirá que se están creando unos cuantos elementos div. Analicemos otra manera de visualizarlo.
- Nuevamente en la ficha Example 4: Table (Tabla), haga clic con el botón secundario en una celda de la tabla y seleccione Inspect (Inspeccionar).
Se abre el panel Elements (Elementos) en DevTools y muestra el marcado HTML de la celda de la tabla.
Ahora verá muchas etiquetas div. Esa es solo una de las celdas de la tabla.
Usemos el monitor de desempeño para verlo de una mejor manera.
- En DevTools, haga clic en
para expandir el menú. Luego, haga clic en More tools (Más herramientas) y en Performance monitor (Monitor de desempeño).
Aparecerá en la parte inferior de DevTools. El monitor de desempeño muestra una vista en tiempo real de distintos aspectos del desempeño de carga de una página o del tiempo de ejecución, como el uso de CPU, el tamaño de pila de JavaScript, la cantidad total de nodos DOM y mucho más.
Observe los nodos DOM. Más de 400 000 nodos. Veamos qué aspecto tiene esto al cargar una página.
- En el monitor de desempeño, anule la selección de las opciones JS heap size (Tamaño de pila de JS) y JS event listeners (Agentes de escucha de evento de JS).
- Vuelva a cargar la página y observe cómo aumenta la cantidad de nodos DOM.
Esto es un posible problema para las páginas que tienen mucha información. No son simples tablas de datos. Esto puede convertirse en un problema según cómo estén desarrollados y conectados los componentes web Lightning. Los componentes dentro de componentes dentro de componentes o los componentes que generan dinámicamente otros componentes o grandes cantidades de etiquetas HTML pueden agregar muchos nodos DOM al formato.
Hemos explorado varias maneras de buscar problemas de desempeño con componentes web Lightning e incluso solo páginas Lightning en general. Ahora cuenta con herramientas nuevas en su lista de herramientas y está mejor equipado para abordar problemas de desempeño.
Recursos
- Blog de trucos de CSS: Diferencia entre la regulación y el controlador de frecuencia de eventos
- Guía para desarrolladores de componentes web Lightning: Uso de bibliotecas externas de JavaScript
- Leer el blog Tea Leaves: Navegadores, eventos de entrada y regulación de marcos
- Blog para desarrolladores de Salesforce: Mejores prácticas de desempeño de componentes web Lightning
- Blog de fundamentos sobre la Web: Encontrar y solucionar problemas de desempeño en aplicaciones web