Visualización de Cuellos de Botella de Rendimiento Front-End

Rate this content
Bookmark

Hay muchas formas de medir el rendimiento web, pero lo más importante es medir lo que realmente importa a los usuarios. Esta charla trata sobre cómo medir, analizar y solucionar el código JavaScript lento utilizando las API del navegador.

34 min
17 Jun, 2021

Video Summary and Transcription

Las herramientas basadas en web de React permiten el aprendizaje independiente. Dazzone, un servicio de transmisión de deportes, se enfrenta a desafíos con objetivos de memoria y CPU bajos. Medir, analizar y solucionar problemas de rendimiento es crucial. La virtualización mejora la eficiencia y el rendimiento de la representación. La aplicación ahora es mucho más rápida con significativamente menos jank.

Available in English

1. Introducción a React y rendimiento web

Short description:

Las herramientas basadas en web de React te permiten diseñar y aprender por tu cuenta. Hay muchos recursos disponibles en el sitio web de Flutter para aprender más sobre React. Rich, un ingeniero de front-end en Dazzone, hablará sobre el rendimiento web. Dazzone es un servicio de transmisión de deportes en vivo y a pedido disponible en nueve mercados en todo el mundo. Proporcionan acceso a deportes a través de televisores inteligentes, consolas de juegos y decodificadores. El equipo enfrenta desafíos con objetivos de memoria y CPU bajos, competencia de recursos y mantener interacciones fluidas. Los sitios web rápidos conducen a una mejor experiencia de usuario, como lo demuestran los datos del documento técnico Getting Faster de Cloudflare.

¿Cómo estás aprendiendo React por tu cuenta? Las herramientas basadas en web de React te permiten diseñar y aprender por tu cuenta. Estas herramientas solo están disponibles para usuarios que trabajan en su propio proyecto. Si estás buscando una forma de aprender más sobre los lenguajes y enseñanzas de React, hay muchos recursos disponibles en el sitio web de Flutter.

Ahora le cederé la palabra a Rich para que te muestre cómo hacerlo por tu cuenta.

Hola. Antes de comenzar, me gustaría agradecer a los organizadores y a los demás oradores de React Summit. Hasta ahora ha sido una conferencia realmente genial y todos están haciendo un gran trabajo. Hoy hablaré sobre el rendimiento web. Mi nombre es Rich. En GitHub y Twitter me conocen como Richie McColt. Soy un ingeniero de front-end y trabajo en una empresa llamada Dazzone en Londres. Soy originario de Glasgow, Escocia. Probablemente puedas notarlo por el acento. Antes de comenzar a hablar sobre el rendimiento web, daré una breve introducción sobre lo que hacemos en Dazzone. Dazzone es un servicio de transmisión de deportes en vivo y a pedido. Estamos presentes en nueve mercados de todo el mundo y brindamos acceso a millones de clientes para que puedan ver los deportes que desean. El equipo en el que trabajo es responsable de los dispositivos de sala de estar. Los dispositivos de sala de estar se dividen en tres categorías: televisores inteligentes, como Samsung, Toshiba y Panasonic; consolas de juegos, como PS4, PS5 y Xbox; y decodificadores, como Comcast, Fire TV y Sky Q. Para poner el rendimiento en contexto con lo que hacemos en Dazzone, los problemas con los que nos enfrentamos están relacionados con objetivos de memoria y CPU bajos, competencia de recursos en el hilo principal. Por ejemplo, si hay una reproducción en segundo plano y el usuario intenta navegar por el contenido al mismo tiempo, debemos mantener interacciones fluidas a 60 fps cuando los clientes navegan por el contenido. Los datos no mienten, ¿verdad? Los sitios web rápidos equivalen a una mejor experiencia de usuario. Esto es lo que prefieren los clientes y es algo a lo que debemos aspirar. Este documento técnico de Cloudflare Getting Faster demuestra algunas citas útiles. Las conversiones disminuyen un 7% debido a solo un segundo adicional de tiempo de carga. Y el 39% de los usuarios dejan de interactuar con un sitio web si las imágenes tardan demasiado en cargarse.

2. Understanding Performance Measurement and Analysis

Short description:

El software rápido marca la diferencia entre una integración fluida en tu vida y la renuencia. Hoy cubriremos la medición, análisis y solución de problemas de rendimiento. Hablaremos sobre el tiempo del usuario, ZPI y tendremos una demostración en vivo. El ciclo de medición-análisis-solución implica medir, analizar, proponer soluciones y repetir hasta estar satisfechos. Tenemos una aplicación de demostración que utiliza la API de SpaceX para renderizar lanzamientos. Para perfilar, utilizaremos el panel de rendimiento de Chrome y nos centraremos en el hilo principal.

Y otra gran cita del ensayo de Craig Maud sobre software rápido es que, para mí, el software rápido marca la diferencia entre una aplicación integrada sin problemas en tu vida y una a la que se llama con gran renuencia. Y como usuarios de software, definitivamente podemos relacionarnos con esto en algún momento u otro.

Entonces, hoy, lo que cubriremos es comprender el método de medición, análisis y solución. Toquemos brevemente el tiempo del usuario y ZPI que proporciona el navegador. Tendremos una demostración en vivo de medición y análisis de una ejecución lenta en código JavaScript. Presentaré la técnica de renderizado de virtualización. Hablaré brevemente sobre los problemas de rendimiento a los que nos enfrentamos en Dazzone. Y finalmente, solucionaré el cuello de botella de rendimiento que tenemos en la demostración.

El ciclo de medición, análisis y solución es una metodología que suelo utilizar al realizar auditorías de rendimiento. Antes de poder analizar y solucionar un problema, primero debemos medir. La medición nos dará la línea de base que necesitamos para analizar el problema realmente. Una vez que analizamos el problema, podemos proponer una solución. Una vez que solucionamos, volvemos a medir. Y este ciclo se repite hasta que obtenemos un nuevo número con el que estamos satisfechos al medir.

Tengo una demostración, una pequeña aplicación de frontend. Está disponible en esta URL de GitHub. Las instrucciones de configuración están en el archivo Léame. Así que si quieres seguir, siéntete libre de hacerlo. Cambiaré a la demostración que tengo en ejecución. Esta aplicación es solo una pequeña aplicación de frontend que utiliza la API de SpaceX para mostrar una lista de lanzamientos de más nuevos a más antiguos. Una interacción que perfilaré es cambiar el orden de los lanzamientos. Entonces, si hago clic en este botón, ahora estoy viendo los lanzamientos más antiguos de SpaceX.

Para perfilar esto, lo que haremos es ir a las Herramientas de desarrollo en Chrome y utilizaremos el panel de Rendimiento. Luego, iremos a la opción de CPU aquí y haremos clic en ralentizar seis veces. Luego, iremos aquí y presionaremos grabar. Y lo que haremos es interactuar con esta función varias veces para obtener algunos datos y detener la grabación. Bien, genial. Lo que podemos ver aquí es que hay bastante actividad. Lo que realmente nos preocupa es esta sección aquí. Esta sección es el hilo principal.

3. Understanding Main Thread Tasks

Short description:

El navegador realiza diferentes tareas para mostrar contenido. El color amarillo indica la ejecución de JavaScript, el morado representa el cálculo del diseño y el verde significa pintar o componer.

Y para aquellos que no están al tanto de lo que sucede en el hilo principal, pasaré rápidamente a una diapositiva diferente y podemos explicar la teoría detrás de ello. Esta imagen aquí es del artículo de blog de Paul Lewis llamado la anatomía de un fotograma. Y esencialmente, el navegador realiza un conjunto diferente de tareas en cualquier momento dado para mostrar cosas en la pantalla. Entonces, cuando estamos perfilando y vemos algo amarillo, sabemos que se ha ejecutado JavaScript. Cada vez que vemos morado, sabemos que se ha calculado el estilo del diseño. Y cada vez que vemos verde, sabemos que hay alguna pintura o composición en la pantalla.

4. Understanding Performance Measurement

Short description:

Volviendo a la demostración, analicemos la interacción. Podemos medir el rendimiento utilizando la API de tiempos de usuario proporcionada por el navegador. Esta API nos permite crear marcas de tiempo y calcular duraciones. Al medir con respecto a la versión de producción, podemos obtener números precisos. Saltemos a la demostración y creemos una línea de base creando una marca de tiempo dentro del evento on-click del botón.

Entonces, volvamos a esa demostración. Ahora que entendemos un poco sobre lo que significan los colores. Si analizáramos esta interacción. Podemos ver aquí que tenemos un evento de clic. Hay algo de amarillo, lo que significa que se está ejecutando JavaScript. Hay algo de morado, lo que significa que hay estilo. Algo de diseño. Y finalmente, hay un poco de verde, lo que significa que la actualización de la pintura ocurre en la pantalla.

Entonces, saltemos rápidamente a cómo medimos las cosas. Pero antes de hacer eso, quiero tocar rápidamente este tema, que es que siempre queremos medir en comparación con la versión de producción. La razón de esto es que las bibliotecas de desarrollo como React tienen código y construcción de desarrollo que no está en la versión de producción. Lo que significa que el código que los usuarios o clientes podrían estar experimentando no es el mismo que el que estarías utilizando en una construcción de desarrollo. Así que siempre mide las versiones de producción solo para tener una idea real de los números.

Entonces, dicho esto, ¿cómo medimos? Esa es la primera pregunta que debemos responder. Eso me lleva a la API de tiempos de usuario. Y la API de tiempos de usuario es proporcionada por el navegador y podemos acceder a ella a través de la ventana performance, que es un objeto. Hay algunos métodos útiles en la ventana performance, como mark. Y lo que hace mark es crear una marca de tiempo de alta resolución. Y podemos asociar esa marca de tiempo con un nombre. Y luego podemos acceder a estas marcas de tiempo usando window performance measure. Y en este ejemplo, he creado dos marcas de tiempo, una llamada create mark start y la otra create mark end. Luego podemos acceder a ellas más tarde usando window performance measure. Y window performance measure crea una nueva marca de tiempo, pero calcula la duración entre un inicio y un final. Entonces, window performance measure es cómo visualizamos cosas en las herramientas para desarrolladores.

OK, ahora que sabemos un poco sobre los fotogramas, sabemos cómo medir. Saltemos a la demostración y comencemos a intentar crear una línea de base. Lo primero que podríamos hacer es, si pensamos en la interacción que estábamos perfilando, cuando hacemos clic en ese botón, el estado cambia y el orden de las tarjetas se actualiza en la pantalla. Entonces, lo primero que podríamos hacer es crear la primera marca de tiempo, que sería el inicio dentro del evento on-click del botón. Así que saltaré a VS Code aquí y podemos echar un vistazo al código. Esta es la aplicación de demostración localmente.

5. Analyzing Transitions and Measuring Performance

Short description:

El componente de la última lista de lanzamientos muestra una lista de lanzamientos. Marcamos el inicio y el final de las transiciones utilizando un gancho personalizado. Al comparar el orden anterior y el nuevo, podemos identificar los cambios de estado. Analicemos y midamos esto en las herramientas para desarrolladores.

Tiene el componente de la última lista de lanzamientos, que es el componente funcional que tiene el botón y muestra una lista de lanzamientos. Así que dentro de aquí, dentro del on-click, marquemos el inicio. Eso es lo primero que tenemos que hacer. Para marcar el final, tenemos que usar un código de instrumentación. Y este código de instrumentación es solo un gancho personalizado que usaremos para almacenar el valor de la renderización anterior dentro de la referencia. Copiaré este gancho personalizado. Y la forma en que lo usaremos es así. Tenemos un efecto que se ejecuta después de la renderización que compara el orden anterior, que hemos utilizado en el gancho personalizado, y lo comparamos con una nueva propiedad de orden. Si esos dos valores son diferentes, sabemos que el estado ha cambiado y podemos marcar el final de esa transición. Así que si copio y pego esto, y lo pongo aquí, eso nos dará algo para analizar y medir en las herramientas para desarrolladores. Ahora volvamos a la demostración. Eso se ha recargado, así que simplemente borraré esta grabación. Presionaré grabar nuevamente y, nuevamente, simplemente interactuaré, cambiaré el orden de los lanzamientos varias veces.

6. Understanding Baseline and Instrumentation

Short description:

En la sección de temporización del usuario, hemos agregado una nueva medida para comprender la línea de base. La combinación de diseño y pintura de estilo JavaScript para esta interacción es aproximadamente de 634 milisegundos, excluyendo el código de instrumentación. La línea de base con la que estamos trabajando está alrededor de 500 a 550 milisegundos.

De acuerdo, hay muchas cosas sucediendo aquí. Tomemos este ejemplo. Como puedes ver, en la sección de temporización del usuario, ahora tenemos una nueva medida. Esta es la medida que acabamos de agregar para comprender la línea de base. Armados con la teoría que teníamos para los frames, podemos ver que esta combinación de diseño y pintura de estilo JavaScript es aproximadamente de 634 milisegundos para esa interacción. Además, recuerda que agregamos el código de instrumentación. Queremos restar el código de instrumentación de ese número. Entonces, esto aquí será ese código de instrumentación, alrededor de 58 milisegundos. Entonces, si restamos 58 de 634, estamos aproximadamente en 500 a 550 milisegundos. Esa es la línea de base con la que estamos trabajando.

7. Understanding DOM and Transition

Short description:

Durante la transición, cambiamos el orden de las tarjetas y tenemos 102 elementos en el DOM, lo que genera mucho trabajo para el navegador.

Entonces, si pensamos en lo que sucede durante esa interacción, estamos cambiando el orden de las tarjetas, ¿verdad? Entonces, la pregunta es, ¿cuántas tarjetas o lanzamientos tenemos en el DOM? Una forma rápida de hacer esto sería cambiar a la pestaña Elementos y buscar el elemento contenedor. Entonces, si miramos este elemento aquí, tiene la lista de lanzamientos. Si hago clic en esos tres puntos y lo guardo como una variable global, significa que ahora puedo acceder a ese elemento y puedo leer algunas propiedades en él. Por ejemplo, la cantidad de elementos secundarios, que me dará la cantidad de lanzamientos que tenemos. Entonces, lo que tenemos aquí son 102 elementos en el DOM. Esto obviamente está generando mucho trabajo para el navegador cada vez que hacemos esa transición.

8. Introducción a la Virtualización

Short description:

La virtualización, también conocida como enmarcado, es una técnica eficiente para renderizar grandes listas de contenido. Al renderizar solo los elementos que son visibles en la pantalla, la virtualización mejora el rendimiento y proporciona una experiencia de usuario fluida.

Entonces, ¿cómo podríamos mitigar esto? ¿Cómo podríamos solucionar este problema? Eso me lleva a la técnica de la virtualización. La virtualización, también conocida como enmarcado, es una forma de renderizar eficientemente una gran lista de contenido. Personalmente, creo que enmarcado es un término mejor para este concepto. Si observamos esta imagen aquí del artículo de desarrollo web, que recomiendo leer, esto ilustra realmente el concepto. El usuario solo está viendo tal vez una cierta cantidad de elementos en la pantalla en un momento dado. Pero también hay algunos elementos fuera de la pantalla que el usuario no ve inicialmente. Por ejemplo, veamos si al usuario le gusta desplazarse rápidamente. Entonces, la ventana cambiaría sobre un subconjunto de esa lista. Y es una forma eficiente de renderizar contenido, como si tuvieras una lista grande.

9. Introducción a la Virtualización en la Zona

Short description:

Adoptamos la virtualización para mejorar la experiencia del usuario en dispositivos de baja gama al eliminar el retraso y la interrupción causados por la carga lenta. La virtualización nos permite cambiar la ventana de lo que el usuario ve al desplazarse, lo que resulta en interacciones más suaves.

Antes de aplicar esta técnica en la demostración, haré un pequeño desvío sobre el trabajo que estábamos realizando en la zona. Así que adoptamos la virtualización en la zona. Y antes de adoptarla, estábamos utilizando un enfoque de carga lenta para renderizar el contenido. Y lo que se puede ver en este GIF es que al subir y bajar el contenido, simplemente cambiamos la ventana de lo que el usuario ve en cualquier momento dado. El problema que teníamos antes era que a medida que el usuario interactuaba y subía y bajaba el contenido, estábamos cargando contenido de forma lenta y cambiando el DOM y actualizando nuevos elementos. El problema con eso en dispositivos de baja gama es que realmente causa un retraso significativo y una interrupción significativa en la user experience. Por lo tanto, queríamos eliminar eso para proporcionar una buena user experience en todos estos diferentes dispositivos.

10. Aplicación de la Virtualización con la Biblioteca Masonic

Short description:

La virtualización es una técnica poderosa que mejora la eficiencia de renderizado y el rendimiento en diferentes dispositivos. Aborda las limitaciones de las plataformas de TV, como la gestión del enfoque y las variaciones de hardware. Al adoptar la virtualización, logramos reducciones significativas en la ejecución de JavaScript, estilo y diseño, y pintura, lo que resulta en interacciones más suaves y una mejor experiencia de usuario. Para aplicar la virtualización a nuestra demostración, utilizaremos la biblioteca Masonic, que ofrece una API sencilla para renderizar tarjetas con ancho personalizable.

La virtualización realmente ayudó aquí. Este es solo un ejemplo vertical. Aquí está el ejemplo horizontal sin ninguna animación. Como puedes ver, solo hay alrededor de cinco elementos en pantalla horizontalmente en cualquier momento dado. Fuera de la pantalla, hay tal vez dos a cada lado. Si el usuario va rápido, por ejemplo, si tiene un control remoto y mantiene presionada la tecla derecha o izquierda, entonces el renderizado es bastante eficiente porque solo estamos cambiando el subconjunto de la vista.

También vale la pena hablar sobre las limitaciones en la TV y cómo son ligeramente diferentes a las limitaciones que puedes enfrentar en la web móvil. Por ejemplo, en la TV, uno de los grandes problemas es la gestión del enfoque y mantener un enfoque consistente en diferentes páginas. Otro problema es la amplia gama de especificaciones de hardware. Por ejemplo, algunos de estos dispositivos tienen una memoria y CPU muy baja, y otros tienen una memoria y CPU aceptables. También estamos lidiando con una amplia gama de motores de navegadores. Creo que el navegador más antiguo que admitimos es Safari 6, que es bastante antiguo. Y obviamente eso significa que hay una falta de estándares web modernos. Al mismo tiempo, también hay una falta de herramientas para desarrolladores, lo que significa que es realmente complicado navegar por este panorama cuando se trabaja con el rendimiento. Y cuando estamos construyendo esta aplicación front-end en la zona, la escribimos una vez y la ejecutamos en todos estos diferentes dispositivos. Por lo tanto, cualquier técnica que utilicemos, como la virtualización, debe demostrar ser efectiva en todos estos diferentes dispositivos.

Algunos datos antes y después de la virtualización. Tomé este perfil utilizando Fire TV con reproducción y la interacción iba de la parte superior de la pantalla a la parte inferior. Así que estaba presionando en el teclado para subir y bajar solo para llegar al final del contenido. Y lo que pudimos ver al adoptar la virtualización fue una reducción del 34% en la ejecución de JavaScript, una reducción del 43% en estilo y diseño, y una reducción del 59% en pintura. Lo cual es una mejora bastante significativa en términos de experiencia de usuario. Fue mucho menos entrecortado, las interacciones fueron mucho más suaves, y pudimos mantener 60 cuadros por segundo en estas interacciones.

Entonces ahora hemos hablado sobre la virtualización y qué es la técnica, ¿por qué no intentamos aplicar eso a esta demostración, dado que tenemos una gran lista de contenido? La biblioteca que usaré se llama Masonic, y en el ecosistema de React, hay una amplia gama de bibliotecas de virtualización. La razón por la que elegí Masonic para esto es que es realmente simple para comenzar. Tiene una API de renderizado de propiedades y solo le decimos al componente qué ancho queremos, y cambiamos la forma en que renderizamos las tarjetas. Así que copiaré esto. Solo cambiaré la forma en que renderizamos las tarjetas. Así que si muevo esto aquí arriba, guardo eso, y vuelvo a la aplicación de demostración en localhost. Solo cerraré la consola, borraré la grabación, y presionaré grabar y solo interactuaré un poco más con esto.

11. Medición del rendimiento y conclusión

Short description:

La aplicación ahora es mucho más rápida, con significativamente menos interrupciones. El DOM se actualiza de manera rápida y eficiente, renderizando solo los elementos en pantalla en un momento dado. Medimos la compilación de producción, que tomó alrededor de 46 milisegundos para la interacción. La virtualización ha proporcionado mejoras significativas y hay otras técnicas que se pueden explorar. En general, discutimos el ciclo de medición, análisis y corrección, la API de tiempo de usuario y los beneficios de la virtualización para renderizar grandes listas de contenido.

Y en realidad, lo que noto es que es más rápido. Hay mucho menos interrupciones que antes. Así que detengamos la grabación.

Bien, acerquémonos a esto. Ahora estamos viendo alrededor de 97 milisegundos para esa interacción, lo cual es una mejora drástica desde los 550 milisegundos. Entonces, la aplicación sigue funcionando como se esperaba. Es solo una lista de contenido. La única diferencia es si miramos el DOM y solo inspeccionamos el elemento contenedor, lo que estamos tratando aquí no son 102 lanzamientos. Estamos tratando con 1, 2, 3, 4, 5, 6. Entonces, solo hay algunos elementos en pantalla en un momento dado, pero se renderizan de manera eficiente y los nodos del DOM se mantienen consistentes en cuanto a la cantidad de nodos del DOM.

Bien, eso es una buena mejora. Estoy contento con eso. Lo siguiente que deberíamos hacer antes de terminar es medir la compilación de producción solo para tener una idea de lo que los usuarios pueden experimentar. Entonces, lo que haré es ejecutar el comando de compilación y luego haré npm run serve, que iniciará un localhost en el puerto 5000, creo. Entonces cambiaré aquí, iré al puerto 5000, y cargará la aplicación. Así que borraré esta grabación. Presionaré grabar y seguiré interactuando un poco más con esto. Entonces las imágenes tardaron un poco en cargarse. Pero podemos ver por la interacción que en realidad el DOM se actualiza bastante rápido. Así que podemos perfilar esto aquí. Puedes ver que ahora ha tomado alrededor de 46 milisegundos para hacer esa interacción, lo cual, considerando que estábamos haciendo alrededor de 550 en una compilación de desarrollo, está bien. La virtualización ofreció mejoras significativas en este caso. Hay más mejoras que podríamos hacer. Realmente no tengo más tiempo para profundizar en eso, pero hay otras técnicas que podríamos usar. Entonces hemos medido y analizado, tenemos una línea de base, que es alrededor de 46 milisegundos, y hemos medido la compilación de producción. Entonces, para concluir, realmente hablamos sobre el ciclo de medición, análisis y corrección, cómo podemos usar eso para identificar problemas de performance, tenemos la API de tiempo de usuario, que es solo una forma de medir. Y he presentado la técnica de virtualización, que es extremadamente útil para renderizar grandes listas de contenido. Y eso es todo. Espero que esto haya sido interesante. Espero que hayas aprendido algo.

QnA

Preguntas y Monitoreo del Rendimiento

Short description:

Si tienes alguna pregunta o comentario, no dudes en contactarme en Twitter y GitHub como Richard McCall. Tenemos una pregunta de G Halpern, quien pregunta sobre el uso de performance.measure con solo un parámetro. Otra pregunta de Mike es sobre la optimización prematura y cómo abordarla. Veo que hay una API de JavaScript para monitorear el rendimiento en sitios, que se divide en dos categorías principales: herramientas de laboratorio y herramientas ROM.

Si tienes alguna pregunta o comentario, no dudes en contactarme en Twitter y GitHub como Richard McCall. Y espero que disfrutes el resto de la conferencia. Gracias. Mantente seguro. Adiós.

Excelente. Excelente. Muchas gracias por dar esta charla y por estar aquí con nosotros hoy para las preguntas, y veo que algunas personas ya están bastante activas enviando preguntas, así que vamos directo al grano.

Tenemos una pregunta. Tenemos una pregunta de G Halpern, quien pregunta, En tu demostración, usaste performance.mark para definir diferentes marcas de tiempo y luego performance.measure para calcular el tiempo transcurrido. Pero, ¿qué hace performance.measure cuando solo se le da un parámetro, que es el nombre? Bueno, performance.measure necesita un inicio y un fin. Entonces, si solo le das uno, en realidad no estás midiendo nada, ¿verdad? Debes tener algún punto de inicio y final para medir el código. Entonces, si solo le das un final, debes preguntarte, ¿qué estás midiendo? Quiero decir, está bien. Es una pregunta válida.

También tenemos una pregunta de Mike. ¿Cuál es tu opinión con toda la caza de performance en la que invertiste y donde todo tenía absolutamente sentido? Pero, ¿cuál es tu opinión sobre la optimización prematura? Si crees que es un problema, ¿cómo abordarlo? Supongo que hay varios tipos de optimización prematura. Como el caso en el que intentas optimizar código que aún no has medido, que probablemente sea uno de los grandes problemas. Como ya he dicho varias veces en esta charla, se trata de medir y obtener los datos en primer lugar. Una vez que has medido y tienes los datos, entonces puedes comenzar a optimizar cosas. Si sientes que estás optimizando código antes de medirlo, ¿cómo sabes cuáles fueron las mejoras si nunca mediste al principio? Creo que siempre medir es realmente la clave principal.

Lo cual me lleva a una pregunta propia. Veo que has hecho esto muy específicamente en las herramientas para desarrolladores. Pero veo que básicamente hay una API de JavaScript. ¿Cómo monitorearías el rendimiento en tus sitios? ¿Hay herramientas que puedes usar? ¿Existen soluciones prehechas o tienes que hacerlo tú mismo? Sí. Buena pregunta. En performance, las herramientas se dividen en dos categorías principales para mí. Así que tienes herramientas de laboratorio y herramientas ROM. Las herramientas de laboratorio son algo como Lighthouse o React Profiler o DevTools, por ejemplo, que prueban el rendimiento en un entorno muy controlado. Y lo que quiero decir con eso es que puedes cambiar una variable y ver cómo cambia y seguir haciendo eso hasta que tengas algo que pueda funcionar. Ese es el entorno de laboratorio.

Herramientas y Estrategias de Monitoreo ROM

Short description:

Para el monitoreo ROM, existen herramientas como Speedcurve, New Relic y Sentry. Sin embargo, el soporte del navegador para la API de medición de rendimiento puede variar. Es importante considerar la compatibilidad del navegador, especialmente para los navegadores más antiguos. Encontrar una estrategia que combine el monitoreo de laboratorio y ROM es crucial.

Para un entorno ROM, que es como el monitoreo de usuarios reales, hay algunas herramientas que podrías utilizar, ¿verdad? Lo que he mostrado aquí es más o menos la API de performance en la ventana. Pero con eso, tienes que tener cuidado en términos de soporte del navegador. Para nosotros en TV, no es lo mejor dado que soportamos navegadores realmente antiguos y no todos admiten la API de medición de performance. Así que eso es algo de lo que hay que estar consciente. Puedes hacerlo si solo estás soportando navegadores modernos. Pero hay otras herramientas como Speedcurve, que es bastante buena. Esa es una opción de monitoreo ROM realmente robusta. Pero obviamente tiene un costo. Y hay productos similares que hacen cosas similares como New Relic que admite el monitoreo de performance en el front-end. También Sentry hace lo mismo. Así que hay algunas opciones, pero realmente se trata de monitoreo de laboratorio y ROM. Por lo tanto, debes encontrar una estrategia que involucre de manera óptima ambos lados de eso, supongo.

Combinando Virtualización y Amigabilidad con SEO

Short description:

¿Es posible combinar virtualización y amigabilidad con SEO? Una forma es pre-renderizar o renderizar en el servidor una versión con todo el contenido solo para Googlebot. Requiere pruebas para evitar problemas. La instrumentación automática se puede lograr a través de la API de rendimiento de la ventana.

Además, Ojo está preguntando, ¿es posible combinar de alguna manera la virtualización y la amigabilidad con SEO en la página? Quiero reducir el trabajo en el hilo principal, pero Googlebot debería ver todo el contenido en el sitio. Es una muy buena pregunta. Realmente no tengo experiencia con eso y tratando de hacer que funcione con el rastreador de JavaScript de Google. No sé qué tan robusto sería un rastreador de JavaScript para algo como la virtualización. Tal vez alguien allá afuera ya conozca la respuesta a eso. Esa es una buena pregunta. Vale la pena investigarlo. Creo que esa pregunta también podría estar apuntando en mi dirección porque en realidad trabajo en el equipo de relaciones de búsqueda de Google y estoy muy familiarizado con Googlebot y sus capacidades de rastreo de JavaScript. Hay varias formas. Una forma sería renderizar de forma dinámica, lo que significa pre-renderizar o renderizar en el servidor una versión con todo el contenido solo para Googlebot. Eso también es aceptable. Además, si está fuera del hilo principal, deberíamos poder ver al menos parte de él. Verifícalo en las herramientas de testing para ver si estamos viendo tu contenido, y alternativamente, tendrías que encontrar formas de presentar el contenido a Googlebot como renderizado dinámico, renderizado en el servidor, etc. Es posible. Solo requiere un poco de testing para asegurarse de que no haya problemas y sorpresas. Sé que nuestra implementación de trabajador web no es perfecta, pero volviendo a la audiencia, Layard pregunta, ¿alguna sugerencia sobre cómo hacer instrumentación automática? Y creo que ya hemos cubierto esto, pero ¿tienes algo más que quieras decir sobre ese tema también? Bueno, si estás en un entorno de laboratorio y quieres usar la API de rendimiento de la ventana, noté que Lighthouse recientemente comenzó a incluir estas medidas dentro de la propia auditoría.

Lighthouse, Análisis de Rendimiento y Buenos Hábitos

Short description:

Ejecutar Lighthouse en un horario puede ayudar a identificar problemas de rendimiento y asegurar que se envíe la compilación correcta. Se recomienda automatizar el informe de Lighthouse con una configuración sin servidor. Para analizar y mejorar el rendimiento, recopila datos utilizando herramientas como pruebas de páginas web. Identifica problemas de rendimiento y propón soluciones basadas en puntos de datos. Google proporciona recursos valiosos, incluyendo las charlas de Google Summit y Chrome Summit. Construir buenos hábitos en el flujo de trabajo de React puede ayudar a evitar problemas de rendimiento a largo plazo.

Entonces, eso es algo que quizás quieras revisar. Recientemente noté que, cuando intentaba ejecutar Lighthouse en un horario diario para algunas de las aplicaciones de TV que tenemos, y estaba accediendo a la página de autenticación que dice registrarse e iniciar sesión, noté que todavía tenían algunos de los pagos de React en nuestro entorno de Edge. Y pensé, eso es extraño. Parece que algunas de estas medidas de rendimiento realmente aparecieron en Lighthouse. Pero también fue así como me di cuenta de que estaban enviando la compilación incorrecta a ese entorno, así que dos problemas sorprendentes.

Eso es genial. Entonces también puedes ejecutar Lighthouse de manera automatizada en un horario. Sí, de hecho, estoy trabajando en una publicación de blog en este momento que configura un informe de Lighthouse sin servidor para que puedas ejecutarlo en un horario y recibir una pequeña notificación que diga, `oye, tu rendimiento es del 98 o algo así`. Lighthouse es realmente bueno. Estoy muy impresionado con Lighthouse en los últimos lanzamientos. Además, tu charla fue muy práctica, y eso es increíble. Pero hay una pregunta de Bri que también me surgió a mí. Yo también tenía esa pregunta. ¿Qué recursos adicionales recomendarías para alguien que está comenzando a analizar y mejorar el rendimiento? Hemos hablado un poco sobre cómo puedes automatizar esto y cómo puedes hacerlo de manera práctica. ¿Qué recursos recomendarías a alguien que recién está comenzando y tratando de entender lo que está viendo?

Sí, supongo que lo primero, antes de intentar solucionar cualquier problema de rendimiento, es obtener los datos en primer lugar. Depende de cómo controles el entorno, pero hay herramientas como pruebas de páginas web que ofrecen la opción de realizar pruebas masivas. Eso sería útil para obtener los datos en primer lugar. Realmente lo que quieres hacer es, una vez que tienes estos puntos clave de datos, comenzar a analizar los datos y desglosar de dónde podrían provenir los problemas, en qué páginas se encuentra el rendimiento, porque realmente lo que quieres hacer es tener un problema de rendimiento en primer lugar. No quieres comenzar a mejorar el rendimiento si no hay ningún problema. Por ejemplo, si estás trabajando en un negocio, debes asegurarte de que este problema de rendimiento esté afectando los resultados finales para el negocio. Debes obtener puntos de datos y luego determinar dónde están los problemas, y luego llevar eso al negocio y decir, `oye, el problema de rendimiento está aquí, propongo que hagamos esto, esto, esto y esto, luego podemos intentar solucionarlo`. Así es como te acercarías a esto desde un punto de vista empresarial. Desde un punto de vista práctico, intenta involucrarte y simplemente entender cómo hacerlo. Hay muchos recursos excelentes, como Google, que probablemente es el mejor lugar para cualquier recurso de rendimiento que he encontrado en mi carrera. Como el Google Summit que hacen, el Chrome Summit. Todas las charlas que hacen una vez al año, siempre hay algo nuevo para ver en esas charlas, así que lo recomendaría. Genial. Además, para evitar problemas de rendimiento desde el principio, Ana pregunta si hay buenos hábitos que recomendarías a alguien nuevo en React para incorporar en su flujo de trabajo y ayudarlos a tener un buen rendimiento a largo plazo y no encontrarse con problemas de rendimiento en primer lugar. Supongo que, desde el punto de vista de React, típicamente estás midiendo el tiempo de carga de la página o las interacciones. Entonces, el tiempo de carga de la página, puedes hacerlo cuando quieras, realmente. Si tu página se carga rápido y no hay nada de qué quejarse.

Optimización del rendimiento en React

Short description:

Para optimizar el rendimiento en React, es importante comprender las interacciones y lo que sucede internamente. Es necesario analizar más a fondo el código para mejorar el rendimiento. Siempre se debe medir la compilación de producción para un análisis preciso del rendimiento.

Si tu página se carga rápido y no hay nada de qué quejarse. En cuanto a trabajar en React y trabajar en rendimiento a medida que avanzas, diría que pienses en las interacciones que estás construyendo y luego intentes comprender qué está sucediendo internamente, creo que es bastante útil. Muchas personas dicen que no deberías tener que mirar internamente, pero en realidad no estoy de acuerdo con eso. Creo que si estás hablando de rendimiento, debes adentrarte un poco más y comprender las interacciones y lo que sucede. Y como dije antes, siempre mide una compilación de producción. Así que no midas como lo hice en la demostración, simplemente midiendo la compilación de desarrollo. Siempre mide la compilación de producción.

Medición del rendimiento y virtualización

Short description:

En cuanto a medir el rendimiento de las aplicaciones en los televisores de los clientes, el ponente explica que actualmente analizan las interacciones en un entorno de laboratorio con diversos dispositivos. Sin embargo, no miden el rendimiento en los televisores de los clientes en el entorno de producción debido a las limitaciones del navegador y los riesgos involucrados. Se plantea otra pregunta sobre la necesidad de virtualización con un pequeño número de elementos. El ponente aclara que la virtualización es beneficiosa para optimizar el uso de la CPU y la memoria, especialmente en dispositivos de gama baja, y recomienda medir el rendimiento para determinar el enfoque adecuado. La sección concluye con agradecimiento por la charla y las preguntas y respuestas, enfatizando la importancia de abordar los problemas de rendimiento.

Hablando de la compilación de producción, esa es una pregunta interesante de Matthias. ¿Cómo, o realmente miden el rendimiento de sus aplicaciones en los televisores de los clientes también? Quiero decir, ustedes quieren estar en el entorno de producción tanto como sea posible, y eso serían los televisores de los clientes, ¿verdad? ¿Lo hacen?

Sí. No, no lo hacemos, pero es algo en lo que estamos trabajando más, no desde el punto de vista del monitoreo de usuarios reales, sino más bien en un laboratorio. Así que tenemos un laboratorio de dispositivos de prueba con todos estos diferentes dispositivos, y lo que queremos hacer es comenzar a analizar las interacciones en un entorno de laboratorio, pero también es un entorno de dispositivo real. Así que es un enfoque híbrido, pero en producción, no. Porque, como dije, algunos de estos navegadores no admiten algunas de las cosas que intentamos hacer, como el marcado y la medición del rendimiento web moderno. Así que es un poco arriesgado para algunos de estos entornos, dado que se compila una vez y se cierra.

Sí. Suena, sí, un punto válido. Otra pregunta más de Spidey, o Spidern, es que en la demostración hay 100 elementos, ¿no es eso todavía un número muy pequeño de elementos para necesitar virtualización? Siento que estamos resolviendo la mayoría de los errores mediante la virtualización hasta que no sea suficiente. ¿Crees que es una buena práctica?

Bueno, quiero decir, la demostración es solo para ilustrar el concepto, tal vez cien elementos. Depende, ¿verdad? Si estás pensando en un Moto G4, como un teléfono promedio estándar, entonces si tienes cien componentes React en la pantalla en un momento dado, y estás tratando de cambiar el orden de ellos en cualquier momento dado, realmente estás poniendo al navegador bajo mucha presión. Así que la virtualización resuelve esa técnica de tener, digamos, seis elementos en el DOM, lo cual es mucho más estable en términos de CPU y también de memoria. Entonces, quiero decir, lo que realmente quieres hacer es medir. No sabrías si cien elementos son muchos o muy pocos a menos que midas. Y por lo que hemos visto en la demostración, incluso midiendo en una computadora portátil moderna con una desaceleración de seis veces, el navegador estaba pasando por mucho solo para hacer esa actualización y era bastante entrecortado. Así que imagina cómo sería eso en un dispositivo de gama baja. Ya veo. Muy bien. Muchas gracias, Richie. Creo que deberíamos pasar al mentee, Paul, que nos diste y ver qué ha dicho la audiencia allí. Así que echemos un vistazo rápido. De acuerdo. Además, gracias de nuevo. Muchas gracias de nuevo por A, la fantástica charla. Creo que no vemos suficientes charlas sobre rendimiento, para ser honesto, porque el rendimiento sigue siendo un gran problema. Y también, B, por todas las preguntas y respuestas. Sé que ha sido mucho y espero que tengas un día fantástico. Muchas gracias por venir. Perfecto. Gracias, Martin. Disfruten el resto de la conferencia, todos. Adiós. Gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
JSNation 2023JSNation 2023
29 min
Modern Web Debugging
Top Content
Few developers enjoy debugging, and debugging can be complex for modern web apps because of the multiple frameworks, languages, and libraries used. But, developer tools have come a long way in making the process easier. In this talk, Jecelyn will dig into the modern state of debugging, improvements in DevTools, and how you can use them to reliably debug your apps.
React Summit 2023React Summit 2023
32 min
Speeding Up Your React App With Less JavaScript
Top Content
Too much JavaScript is getting you down? New frameworks promising no JavaScript look interesting, but you have an existing React application to maintain. What if Qwik React is your answer for faster applications startup and better user experience? Qwik React allows you to easily turn your React application into a collection of islands, which can be SSRed and delayed hydrated, and in some instances, hydration skipped altogether. And all of this in an incremental way without a rewrite.
React Summit 2023React Summit 2023
23 min
React Concurrency, Explained
Top Content
React 18! Concurrent features! You might’ve already tried the new APIs like useTransition, or you might’ve just heard of them. But do you know how React 18 achieves the performance wins it brings with itself? In this talk, let’s peek under the hood of React 18’s performance features: - How React 18 lowers the time your page stays frozen (aka TBT) - What exactly happens in the main thread when you run useTransition() - What’s the catch with the improvements (there’s no free cake!), and why Vue.js and Preact straight refused to ship anything similar
JSNation 2022JSNation 2022
21 min
The Future of Performance Tooling
Top Content
Our understanding of performance & user-experience has heavily evolved over the years. Web Developer Tooling needs to similarly evolve to make sure it is user-centric, actionable and contextual where modern experiences are concerned. In this talk, Addy will walk you through Chrome and others have been thinking about this problem and what updates they've been making to performance tools to lower the friction for building great experiences on the web.

Workshops on related topic

React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
JSNation 2023JSNation 2023
170 min
Building WebApps That Light Up the Internet with QwikCity
Featured WorkshopFree
Building instant-on web applications at scale have been elusive. Real-world sites need tracking, analytics, and complex user interfaces and interactions. We always start with the best intentions but end up with a less-than-ideal site.
QwikCity is a new meta-framework that allows you to build large-scale applications with constant startup-up performance. We will look at how to build a QwikCity application and what makes it unique. The workshop will show you how to set up a QwikCitp project. How routing works with layout. The demo application will fetch data and present it to the user in an editable form. And finally, how one can use authentication. All of the basic parts for any large-scale applications.
Along the way, we will also look at what makes Qwik unique, and how resumability enables constant startup performance no matter the application complexity.
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Data Fetching Strategies
Top Content
WorkshopFree
- Introduction- Prerequisites for the workshop- Fetching strategies: fundamentals- Fetching strategies – hands-on: fetch API, cache (static VS dynamic), revalidate, suspense (parallel data fetching)- Test your build and serve it on Vercel- Future: Server components VS Client components- Workshop easter egg (unrelated to the topic, calling out accessibility)- Wrapping up
React Advanced Conference 2023React Advanced Conference 2023
148 min
React Performance Debugging
Workshop
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
Vue.js London 2023Vue.js London 2023
49 min
Maximize App Performance by Optimizing Web Fonts
WorkshopFree
You've just landed on a web page and you try to click a certain element, but just before you do, an ad loads on top of it and you end up clicking that thing instead.
That…that’s a layout shift. Everyone, developers and users alike, know that layout shifts are bad. And the later they happen, the more disruptive they are to users. In this workshop we're going to look into how web fonts cause layout shifts and explore a few strategies of loading web fonts without causing big layout shifts.
Table of Contents:What’s CLS and how it’s calculated?How fonts can cause CLS?Font loading strategies for minimizing CLSRecap and conclusion