Más allá de las listas virtuales: Cómo renderizar 100K elementos con 100s de actualizaciones/seg en React

Rate this content
Bookmark

Generalmente hay una buena comprensión de cómo renderizar grandes conjuntos de datos (digamos, 100K elementos) usando listas virtuales, ...si permanecen en gran medida estáticos. ¿Pero qué pasa si se están agregando o actualizando nuevas entradas a un ritmo de cientos por segundo? ¿Y si el usuario debería poder filtrarlos y ordenarlos libremente? ¿Cómo podemos mantenernos receptivos en tales escenarios? En esta charla discutimos cómo Flipper introdujo transformaciones FSRW inspiradas en map-reduce para manejar tales escenarios con gracia. Al aplicar las técnicas introducidas en esta charla, las tasas de cuadros de Flipper aumentaron al menos 10 veces y esperamos abrir el código de este enfoque pronto.

27 min
22 Oct, 2021

Video Summary and Transcription

La charla discute la optimización de la renderización de grandes tablas utilizando Flipper, una nueva versión que es diez veces más rápida con una mejor interacción del usuario y datos más ricos. Explora la optimización de la renderización con React, virtualización, filtrado, ordenación y técnicas de ventanas. La introducción del paquete de datos de Flipper simplifica la gestión de actualizaciones, inserciones y eliminaciones. El rendimiento del paquete de datos de Flipper es excelente, incluso en una compilación de depuración de React, con un uso mínimo de CPU. La sesión de preguntas y respuestas cubre la ordenación incremental, la altura de fila dinámica y el potencial para la virtualización bidimensional en el futuro.

Available in English

1. Optimizando la Representación de Tablas Grandes con Flipper

Short description:

Soy Michel Vestrater de Facebook, y hoy hablaré sobre la optimización de la representación de tablas grandes utilizando Flipper. La implementación original era lenta, especialmente con filtros y problemas de ajuste de línea. Construimos una nueva versión que es diez veces más rápida, con una interacción de usuario mejorada y datos más ricos. La mejora del rendimiento fue significativa, con una caída de fotogramas diez veces menor y un uso reducido de la CPU.

Buenos días a todos. Mi nombre es Michel Vestrater. Trabajo en Facebook, creo, porque podría tener otro nombre hoy. Pero es bueno estar aquí y es muy bueno ver todos sus rostros sin ver también su dormitorio y su ropa y su tazón de avena vacío. Gracias por tenerme.

Actualmente estoy trabajando en un proyecto llamado Flipper que es una plataforma de código abierto que es utilizada principalmente por desarrolladores móviles. Y voy a hablar sobre cómo optimizar la representación de tablas realmente grandes. Y en esta charla, hablaré un poco sobre Flipper. Encontraré una aplicación realmente útil de bitcoins y les mostraré una biblioteca de código abierto.

Entonces, en primer lugar, hay una herramienta llamada ADB que se utiliza para debugging aplicaciones móviles. Y si ejecutas, por ejemplo, ADB log, simplemente genera muchos datos. Puede generar fácilmente hasta 100 líneas por segundo o algo así. Y entonces estamos trabajando en Flipper, una herramienta que te permite inspeccionar diseños en un dispositivo móvil y ver las solicitudes de red de tu aplicación React Native y así sucesivamente. Sin embargo, nos vamos a centrar en esta charla en una característica específica, que son los registros. Y los registros, básicamente muestran la misma salida que acabas de ver de ADB, excepto que lo hemos analizado para que pueda ordenar un filtro.

Ahora, la implementación original que teníamos no es muy fluida. Como que empieza un poco, no mantiene realmente el ritmo, y especialmente si aplicas algunos filtros, se ralentiza. Y además, no envuelve correctamente las líneas, lo cual es realmente molesto si usas registros. Así que pensamos que esto es demasiado lento, y en realidad lo que detectamos, incluso en las compilaciones de producción, si el filtro es un poco complicado, y ya tienes 100,000 líneas de registro en él, entonces una sola pasada de renderizado de nuestro componente React podría consumir fácilmente hasta 250 milisegundos, por lo que terminas con cuatro fotogramas por segundo, lo cual es realmente molesto.

Y entonces pensamos que necesitábamos una mejor implementación, y construimos una. Y esta es la nueva versión, que es mucho más suave, pero que realmente mantiene el ritmo con los datos que llegan a través de ADB, e incluso si estás filtrando, apenas afecta al rendimiento. Y también mejoramos mucho la interacción del usuario, así que tenemos enlaces que se resaltan, las líneas se ajustan automáticamente si cambias el tamaño de la ventana, ese tipo de cosas. Así que hicimos los datos mucho más ricos, e incluso añadimos cosas como poder ordenar en cualquier columna que quieras.

¿Y cómo afectó esto al rendimiento? Resulta que el rendimiento de la nueva implementación fue diez veces más rápido. Y vimos que en Facebook, medimos cuál es el rendimiento, cuántos fotogramas dejamos caer, cuál es la carga de la CPU para nuestros usuarios, y básicamente vimos una caída de fotogramas diez veces menor, y un uso mucho más lento de la CPU. Y si miras el perfil en Chrome, podemos explicar eso. Y entonces las dos secciones de la izquierda son básicamente la situación antigua donde hay mucha CPU en marcha y la mayoría de ella es amarilla. Y el amarillo significa que esto está ejecutando JavaScript código, nuestro código de Flipper. Y en la nueva situación, todavía hay mucho uso de la CPU pero se gasta de manera diferente. Ya no se gasta en la parte amarilla, ya no en el scripting.

2. Optimizando la Representación con React

Short description:

Ahora está realizando mucho diseño y estilizado, lo que significa que está generando muchos más fotogramas por segundo. Establecemos una conexión WebSocket con Coinbase y comenzamos a escuchar tres tipos diferentes de tasas de cambio. Introducimos un estado para almacenar todas las filas que llegan y aplicamos filtros y funciones de clasificación. Luego, representamos las filas una por una.

Ahora está realizando mucho diseño y estilizado, y eso significa que está generando muchos más fotogramas por segundo. Entonces, en resumen, el morado es bueno. El amarillo es malo. Entonces, ¿cómo hicimos eso? Y para explicarlo un poco, voy a mostrarles una pequeña aplicación de demostración que transmite muchas transacciones de Bitcoin para que al menos pongamos todos esos ciclos de CPU desperdiciados en buen uso. Y no soy tan valiente como Sarah, así que simplemente lo pregrabé. De todos modos.

Entonces, comencemos con la base. ¿Qué hacemos? Establecemos una conexión WebSocket con Coinbase y comenzamos a escuchar tres diferentes tasas de cambio. Y para cada nuevo mensaje que llega, recogemos las devoluciones de llamada. Y los data básicamente se ven un poco así. Solo un intercambio de una cierta tasa. Entonces, lo que sucede aquí es que realmente no estamos representando nada. Lo siento. Estoy estropeando esto. Entonces, lo que Sarah puede hacer con la codificación en vivo, yo puedo hacerlo con un video. ¿No es asombroso? Entonces, la idea aquí es que aún no representamos nada. Y si comienzas a transmitir, verás que básicamente estamos recibiendo mil elementos por segundo. La CPU no está haciendo nada porque no hacemos nada con ella. Pero esta es nuestra línea de base. Entonces, conceptualmente, esto es lo que está sucediendo. Entonces, vamos a mezclar React.

Entonces, tenemos nuestros pequeños componentes base y comenzamos a introducir un estado en el que almacenamos todas las filas que llegan. También comenzamos con un conjunto base de diez mil filas para tener al menos algo. Y cada vez que llega cualquier fila, actualizamos el estado, asignamos un nuevo array y lo colocamos allí. Y luego, si hay un filtro activo, lo aplicamos al conjunto de datos. Y de manera similar, si el usuario quiere ordenar las secciones por precio, aplicamos una función de clasificación. Entonces, mapeamos todas las filas y las representamos una por una. Entonces, si ejecutas esto... Oh, creo que la presentación se rompió al moverla a un portátil. De todos modos, eso es lo que sucede si lo cambias en el último momento.

3. Optimizando la Representación con Virtualización

Short description:

Si renderizas esto, se renderiza bastante bien siempre que los datos sean estáticos. Pero tan pronto como empezamos a filtrar realmente empieza a ralentizarse. Ahora tenemos cinco fotogramas por segundo y la CPU en la parte inferior está al máximo. Lo obvio que hacer en estas situaciones es aplicar virtualización. Tomemos un terminal, por ejemplo, solía tener una cantidad fija de líneas de desplazamiento, pero los ingenieros quieren líneas ilimitadas para un desplazamiento rápido, búsqueda y filtrado. Lo mismo ocurre con los paneles de control con actualizaciones de datos en tiempo real. La aplicación de la virtualización es la solución típica, siendo React Virtual una biblioteca muy recomendada. Proporciona un hook para renderizar grandes conjuntos de datos de manera eficiente.

Entonces, si renderizas esto, se renderiza bastante bien siempre que los data sean estáticos. Pero tan pronto como empezamos a filtrar realmente empieza a ralentizarse. Ahora tenemos cinco fotogramas por segundo y la CPU en la parte inferior está al máximo. Y si empezamos a habilitar la transmisión, en realidad somos capaces de procesar como tres nuevos registros por segundo y eso es porque estamos renderizando todas esas 10,000 filas una y otra vez.

Esto es realmente lento, no es una buena idea. Lo obvio que hacemos en este tipo de situaciones es aplicar virtualización. En este punto, normalmente hay algunas personas que se preguntan, ¿por qué estás renderizando 10,000 filas en primer lugar? Eso no es una buena user experience. ¿Por qué mostrar tantos data? Y en mi experiencia, eso suele ser una especie de excusa barata para evitar un problema difícil. Y es muy sencillo de demostrar. Tomemos un terminal. Hace una década, solía tener una cantidad fija de líneas de desplazamiento, como quizás 1,000. Y lo que hace cada ingeniero es ponerlo en ilimitado. Queremos tener todas esas líneas a nuestro alcance cuando hacemos una instalación de NPM. Queremos desplazarnos muy rápidamente, buscar, filtrar. Y estoy bastante seguro de que la mayoría de los ingenieros dejarían ese trabajo si alguien sugiriera que el terminal debería ser paginado. Y lo mismo ocurre con muchos paneles de control que muestran una gran cantidad de data comerciales, gráficos, filas que se actualizan con información de acciones en realtime. Tener miles de puntos de data con cientos de actualizaciones por segundo no es realmente tan extraño en absoluto.

Entonces, lo típico que hacer en este punto es aplicar virtualización. Hay un montón de buenas bibliotecas por ahí para React, React Window, Virtuoso, pero la mejor que encontré es React Virtual de Tanner Lindsay. Y es realmente buena. Básicamente, el uso es bastante sencillo. Te proporciona un hook, pero también soporta el envoltorio de filas. Y la idea es que llamas a este useVirtualHook, le das la cantidad de data que quieres renderizar y un contenedor que se utiliza para los cálculos de tamaño. Y luego te devuelve un montón de elementos para mapear, y para cada uno de ellos, aplicas un poco de estilo. Es un montón de estilo, pero es realmente sencillo construir esto.

Así que pongamos esto a prueba. Entonces, de nuevo, en el conjunto de datos estático, se desplaza muy fluidamente. Y lo interesante es que, una vez que empezamos a transmitir los data, ahora podemos, en lugar de tres, cuatro elementos, podemos renderizar - podemos recibir un par de cientos de elementos antes de que empezamos a ralentizarnos. Ahora, el filtrado sigue siendo caro. Como, una vez que aplicas el filtrado y la clasificación, realmente ves la cantidad de elementos que puedes procesar en el ínterin disminuir.

4. Optimizando la Representación: Filtrado y Clasificación

Short description:

React Virtuall resuelve el problema del desplazamiento rápido para conjuntos de datos estáticos, pero no aborda el costoso procesamiento de datos. La memorización y el rebote pueden ayudar hasta cierto punto, pero no resuelven completamente los problemas de rendimiento. Para optimizar la representación, podemos filtrar solo los datos que llegan, en lugar de todo el conjunto de datos. Al ordenar las filas en una referencia en lugar de un estado y actualizar el conjunto de filas visibles en función del filtro, podemos mejorar el rendimiento.

Y también estamos aprovechando al máximo la CPU. Entonces, React Virtuall resuelve el problema para nosotros si tenemos un conjunto de datos estático y necesitamos poder desplazarnos muy rápido. Ese es el problema que resuelve. Sin embargo, esto no resuelve nuestro problema. Porque esa no es la única parte que es costosa, la representación. También es el procesamiento de data. Si cada vez que recibimos un nuevo elemento, tenemos que mapear todo el conjunto de datos, filtrarlo de nuevo. Y si la clasificación está activa, también tenemos que reordenar el conjunto de datos. Ahí es donde realmente se va el rendimiento.

Entonces, la virtualización ya la teníamos en el primer ejemplo que mostré. Y aún así, todavía teníamos 250 milisegundos por representación solo por todo el procesamiento que se lleva a cabo. Y hay algunos trucos que la gente suele aplicar. Como, podríamos memorizar las filas filtradas. Pero eso realmente no ayuda. Eso solo ayuda si el filtro cambia de vez en cuando. Pero no si tus filas están cambiando todo el tiempo. Si tienes docenas de actualizaciones que tienes que procesar, entonces tu memo nunca va a tener un acierto positivo en la caché. Y de manera similar, puedes rebotar, lo que asegura que al menos tu aplicación tipo de se mantiene utilizable. Pero no disminuye el rendimiento de una sola representación. Y te permite ir más allá de esos cuatro fotogramas por segundo en nuestro caso de uso. Entonces, ¿qué podemos hacer de manera más inteligente?

Una cosa que podemos hacer de manera más inteligente es no filtrar todo el conjunto de datos que tenemos. En realidad, ya sabemos para cada elemento si cumple o no los criterios de filtro. Solo necesitamos filtrar los data que llegan, no los data que ya tenemos. Así que hagamos eso. Así que lo primero es que no vamos a ordenar nuestras filas en estado, lo que causaría una representación cada vez que lo cambiamos, pero ordenamos en ref. Y el estado que vamos a contener son solo las filas visibles. Ahora, si llega un nuevo evento, lo aplicamos al conjunto base, y luego también verificamos si coincide con el filtro actual. Si coincide con el filtro actual, entonces también actualizamos el conjunto de filas visibles. Y luego hay una cosa más que hacer, es que cada vez que el criterio de filtro en sí entonces necesitamos volver a filtrar todo el conjunto, pero ahora ese es el caso excepcional. Y entonces pongamos esto a prueba.

5. Optimizando el Filtrado, Clasificación y Ventaneo

Short description:

Optimizamos el filtrado y la clasificación actualizando solo el estado si el elemento coincide con el filtro. Esto reduce el costo de filtrado de O(n) a una sobrecarga constante. Para la clasificación, aprovechamos el hecho de que los datos ya están ordenados y utilizamos una búsqueda binaria en lugar de una clasificación completa. Esto mejora el rendimiento de O(n log n) a log n. Además, podemos ventanear los datos que procesamos para una optimización adicional.

Así que recuerda, lo importante es que solo actualizamos el estado si el elemento coincide con el filtro. Así que en el caso base, nuestro performance es el mismo que en el ejemplo anterior. Sin embargo, si empezamos a filtrar, ahora el performance aumenta en el sentido de la cantidad de nuevos elementos que podemos procesar. Porque ahora en 2 de cada 3 de las transacciones, no causamos una renderización. Así que dejamos mucha más capacidad de CPU disponible para procesar ese WebSocket entrante. Así que, eso ya es una buena mejora. Esto mueve nuestro costo de filtrado del orden de n a una sobrecarga constante.

¿Podemos hacer lo mismo para la clasificación? Y la respuesta es sí. También podemos hacer exactamente lo mismo para la clasificación. ¿Cómo lo hacemos? La idea básica es que aprovechamos el hecho de que sabemos que lo que estamos renderizando ya está ordenado, si estaba ordenado antes. Así que cuando llegan nuevos data, no necesitamos reordenar el conjunto completo. En su lugar, podemos utilizar una pequeña utilidad de Lodash. Y encontrar utilizando sorted last index by, el binario, el índice de inserción en el que tenemos que insertar nuestra nueva fila. Y entonces solo hay una búsqueda binaria en lugar de una clasificación completa en los data. Así que pasan de básicamente N log N a log N. De nuevo, lo mismo se aplica para si la clasificación en sí cambió, tenemos que hacer el conjunto completo, pero, de nuevo, este es el caso menos común.

Así que pongamos esto a prueba. Y recuerda, lo crucial aquí es que en lugar de ordenar el conjunto completo, hacemos una búsqueda binaria para encontrar la posición de inserción. Y así, de nuevo, procesamos los data. Empezamos a seguir. Empezamos a filtrar. Y tenemos un buen performance. Y ahora habilitamos la clasificación. Así que ahora el conjunto de data está ordenado. Y sin embargo, no afecta realmente a nuestro performance. Y normalmente la clasificación es realmente costosa. Ahora no está impactando tanto. Así que ahora optimizamos el filtrado, optimizamos la clasificación. ¿Podemos hacerlo aún mejor que esto? Y la respuesta es sí. También podemos empezar a ventanear los data que procesamos.

6. Aplicando Ventaneo Anteriormente

Short description:

Podemos aplicar el ventaneo anteriormente en el momento en que procesamos los datos. Si se agrega una nueva fila fuera de la vista actual, no necesitamos desencadenar la renderización o volver a renderizar React.

Ahora suena un poco controvertido porque ya estamos aplicando ventaneo, pero solo estamos aplicando ventaneo a la renderización. Pero en realidad, si lo piensas, podemos aplicar el ventaneo anteriormente en el momento en que procesamos los data. Así que cuando se agrega una nueva fila, pero se agrega efectivamente fuera de la vista actual, ni siquiera necesitamos desencadenar una renderización. Incluso si coincide con el filtro y encuentra el índice de inserción. Si después de eso encontramos que no está dentro del viewport, en realidad no hay necesidad de causar que react vuelva a renderizar y haga esos cálculos de fertilización. Así que apliquemos también ese truco.

7. Optimización de la Renderización: Ventaneo y Rendimiento

Short description:

Introducimos una ventana para capturar el conjunto visible de filas y utilizamos un truco de actualización forzada para renderizar React cuando sea necesario. Después de cada renderización, almacenamos el rango renderizado y verificamos si un índice de inserción está dentro de la ventana visible. Existe un caso de excepción para desencadenar una renderización para asegurar que la barra de desplazamiento sigue creciendo. Las pruebas muestran un rendimiento mejorado con un uso mínimo de la CPU.

Así que ahora no tenemos ningún estado. Y para capturar lo que estamos viendo actualmente, introducimos una ventana que simplemente comienza el conjunto visible de filas y utilizamos un truco, actualización forzada, para forzar una renderización de React cuando queramos. Y si no queremos renderizar, React nunca volverá a renderizar.

Ahora lo siguiente que hacemos es después de cada renderización, almacenamos el rango que renderizamos, el rango que obtuvimos de React virtual, lo siento. Y luego verificamos cuando encontramos el índice de inserción de una fila, verificamos si está dentro de Luego verificamos React para renderizar, y de lo contrario no.

Ahora hay un caso de excepción, y eso es que una vez en las cien filas, todavía vamos a desencadenar una renderización, y eso es para asegurarnos de que nuestra barra de desplazamiento sigue creciendo si más data llega, incluso si todos los data llegan fuera del viewport actual. Así que probemos esto. Así que empezamos a transmitir, y ves que, como, procesamos muchos data, especialmente si no seguimos, porque entonces todos los eventos ocurren fuera de la ventana. Cada cola, todavía tenemos el mismo performance que antes, pero sin nuestra cola, todo, casi todo se añade fuera de la pantalla, así que, apenas usamos cualquier CPU. Esta es también la primera vez que la CPU realmente cae por debajo del uso máximo.

8. Optimizando la Renderización con Flipper Datasource

Short description:

Ahora tenemos una tubería más larga para filtrar, iniciar y verificar actualizaciones dentro de la ventana visible antes de la renderización. Hemos generalizado este enfoque en el paquete Flipper Datasource, que maneja actualizaciones, inserciones y eliminaciones utilizando una tubería de operaciones. Al transformar la operación inicial y aplicar la ordenación, podemos manejar fácilmente diferentes tipos de operaciones. Con el paquete de datos de Flipper, podemos refactorizar nuestro ejemplo para eliminar la lógica personalizada y la renderización, y en su lugar usar el origen de datos para manejar eventos y actualizar la configuración de la vista cuando cambian los criterios de filtro o de ordenación.

Entonces, ahora tenemos una tubería más larga, filtramos, iniciamos, verificamos si la actualización realmente aparece dentro de la ventana visible, y solo si todo eso es cierto, entonces hacemos que React se renderice. Así que, ahora añadimos mucha lógica, y solo fue para añadir. ¿Cómo lidiamos con las actualizaciones? ¿Cómo lidiamos con las inserciones? ¿Cómo lidiamos con las eliminaciones? Y la solución que les he mostrado hasta ahora, la hemos generalizado en un paquete. Se llama Flipper Datasource. Se mantiene por ahora dentro del repositorio de Flipper en GitHub. Pero puedes usar este paquete de inmediato. Y la idea básica es que todas las demás operaciones básicamente siguen el mismo patrón. Una actualización o una eliminación no es significativamente diferente de una inserción. Esos cuatro pasos son básicamente una tubería que es donde describimos la operación inicial. Por ejemplo, añadiendo un elemento. Y luego aplicamos la ordenación y simplemente transformamos la descripción de la operación. Así que una operación de añadir se convierte en una inserción en una posición diferente con el mismo elemento. Y luego también tenemos una operación de inversión en caso de que estemos ordenando al revés. Y luego decidimos si esta operación termina en la ventana. Así que primero transformamos la operación sin pensar en la renderización en absoluto. Y las demás operaciones también son realmente fáciles de expresar en estos mismos términos. Simplemente pasan por la misma tubería. Así que vamos a refactorizar nuestro ejemplo para aprovechar el paquete de datos de Flipper. Así que eliminamos toda nuestra lógica personalizada, nuestros efectos. Todavía tenemos los mismos criterios de vista. El usuario todavía tiene las mismas características. Solo vamos a conectarlo de manera diferente. Así que ya no necesitamos React Virtual. Eso está abstraído. Eliminamos todo eso de la renderización, que está por aquí. Ahí vamos. Y luego simplemente importamos algunas cosas de los paquetes. Así que importamos el crear data source, que crea el data source y mantenemos una referencia a él. Y lo único que hacemos cuando llega un nuevo evento es llamar a append, y eso almacena el evento en el data source. Entonces, cada vez que el usuario cambia los criterios de filtro o de ordenación, simplemente actualizamos la configuración de la vista del data source.

9. Optimizando la Renderización con Flipper Data Source

Short description:

Pasamos el data source al renderizador de data source virtual, lo que resulta en la misma funcionalidad que lo que hemos construido hasta ahora en esta demostración. El rendimiento es excelente, incluso en una compilación de depuración de React. El uso de la CPU es mínimo, incluso con un alto volumen de registros y filtrado. El paquete de data source de Flipper hace que la demostración sea eficiente y se utiliza para alimentar vistas críticas en Flipper. Tiene potencial para su uso futuro en la alimentación de gráficos.

Ese data source, lo pasamos al renderizador de data source virtual. Y con eso, básicamente tenemos lo mismo que lo que hemos construido hasta ahora en esta demostración. Es solo ahora unas pocas líneas de code.

Entonces, pongamos esto a prueba. De nuevo, empezamos. Empezamos a seguir. Haciéndolo difícil. Y empezamos a filtrar. Y en realidad vemos que, como, el performance es realmente bueno ahora. Aunque esto es solo una compilación de debug de React, se mantiene fácilmente en términos de CPU.

Entonces, esto está implementado de manera un poco más eficiente de lo que hemos hecho hasta ahora. Pero ahora nuestra CPU apenas está sudando. Aunque estamos agregando casi mil registros por segundo y los estamos ordenando y filtrando. Y para hacerlo aún más difícil, podemos comenzar con un gran conjunto de datos. Entonces, en lugar de 10,000 elementos, comencemos con 100,000. De nuevo, hicimos lo mismo. Y lo que notaremos es que, esto lo hace un poco más caro. Entonces, el uso de la CPU es un poco más alto. Pero aún así, se mantiene bien. Así que no estamos maximizando en CPU y JavaScripting. Lo que significa que la renderización, la tasa de fotogramas, se mantiene estable a 50 fotogramas por segundo.

Entonces, básicamente, esto es todo lo que quedaba para hacer que esta demostración fuera eficiente. Y eso es lo que hace el paquete de data source de Flipper. No es perfecto todavía, pero funciona muy bien en esos casos. Lo usamos para alimentar todas nuestras vistas críticas en un flipper. Puedes simplemente mirar el code fuente. Está en nuestro repositorio. Y hay algunas ideas futuras. Como, el mismo mecanismo podría usarse, por ejemplo, para alimentar gráficos. Hay una pequeña demostración de ello.

QnA

Preguntas y Respuestas: Ordenamiento Incremental y Altura de Fila Dinámica

Short description:

Pero hay muchas posibilidades. Porque, como muchas visualizaciones, siguen este filtro, ordenan y ventanean. Así que, pruébalo. Házmelo saber qué piensas. Si tienes alguna pregunta, no dudes en preguntar. Gracias. La primera es, ¿cómo funciona el ordenamiento incremental con datos no lineales? Los datos entrantes no tienen que estar ordenados en absoluto. Como, puedes ordenar en tantos criterios como sea posible. Siempre que tengas una función de ordenamiento estable, eso funciona. Perfecto. Otra pregunta es ¿cómo maneja la lista virtual la altura de fila dinámica? Mide y almacena en caché las mediciones para compensar los siguientes elementos. Eso funciona en la práctica realmente bien. Gracias por la gran charla.

Pero hay muchas posibilidades. Porque, como muchas visualizaciones, siguen este filtro, ordenan y ventanean. Así que, pruébalo. Házmelo saber qué piensas. Si tienes alguna pregunta, no dudes en preguntar. Gracias.

Esa fue una charla increíble. Muchas gracias. Aplaudamos de nuevo por él. Muy bien. Así que, tenemos algunas preguntas que llegaron durante la charla y simplemente te las haré y luego lo que haremos es al final, escogerás tu pregunta favorita y esa persona puede obtener una camiseta. Así que, simplemente iré en el orden en que han sido votadas hasta ahora.

La primera es, ¿cómo funciona el ordenamiento incremental con datos no lineales en términos de tener que volver a calcular el conjunto de datos ordenados, un conjunto entrante no ordenado de fechas, por ejemplo? Entonces, déjame ver si entiendo correctamente la pregunta. Entonces, cómo funciona el ordenamiento es que se basa en una función de comparación donde puedes, como, tener una salida de ordenamiento estable. Por ejemplo, puede haber una fecha de hecho. Y solo se compara en relación con otros elementos. Entonces, los datos entrantes no tienen que estar ordenados en absoluto. Como, puedes ordenar en tantos criterios como sea posible. Siempre que tengas una función de ordenamiento estable, eso funciona. Perfecto.

Y otra pregunta es ¿cómo maneja la lista virtual la altura de fila dinámica? Esa es una muy buena pregunta. He leído el código fuente de eso un rato. Entonces, lo que hace, ejecuta los elementos, luego los mide y almacena las mediciones y usa eso para compensar los siguientes elementos. Pero porque, como, la altura se memoriza por fila, al menos mientras el ancho no cambie, eso funciona en la práctica realmente bien. Tienes que dar una función heurística para la altura base de edición. Pero luego eso comienza a ajustarse. Curiosamente, eso no es realmente notable. Genial. Y otra más. Gracias por la gran charla.

Preguntas y Respuestas: Fuente de Datos de Flippa y Noches en Vela

Short description:

¿La fuente de datos de Flippa tiene una API para la virtualización en dos dimensiones? No, actualmente solo admite virtualización unidimensional. Agregar submuestreo a la abstracción sería útil para trazar gráficos. El auto-zebra-rendering se puede lograr utilizando el índice del elemento de la matriz. No hubo muchas noches en vela durante el desarrollo de Flipper. Puedes descargar Flipper y probarlo. Gracias por tus preguntas y no dudes en continuar la discusión en las salas designadas.

¿La fuente de datos de Flippa ya tiene una API para la virtualización en dos dimensiones, por ejemplo, para cuadrículas? No. Actualmente solo realiza virtualización unidimensional. Y también lo que creo que es realmente interesante agregar en el futuro es agregar submuestreo a la abstracción. Eso lo haría realmente útil para trazar gráficos si pudiéramos submuestrear dinámicamente los eventos que llegan.

Genial. ¿Has intentado optimizar el auto-zebra-rendering? Entonces, por ejemplo, filas oscuras y claras una tras otra. No, no lo intenté. Pero eso no debería... Lo que obtienes de useVirtual es solo una matriz con elementos. Por lo tanto, puedes usar el índice del elemento de la matriz para el zebraing, en lugar de asociarlo con los data. Eso debería funcionar bien. A menos que realmente te importe que la fila específica siempre sea gris y la otra siempre blanca. Pero no creo que ese sea generalmente el caso.

Bien. Ahora, hay tantas preguntas, no podremos llegar a todas. Así que solo haré esta última para terminar, porque esta es una de mis favoritas. ¿Cuántas noches en vela hubo, llegando a esta solución final? En realidad, no tantas. La razón es que quería construir esto hace años, pero nunca tuve una excusa sólida, hasta que comencé a trabajar en Flipper. Y así Flipper, para responder a tu pregunta, sí, lo usamos en la vida real en Flipper. Así que puedes descargar Flipper y probarlo. Así que no dio tantas noches en vela. Genial, muchas gracias. Ahora sé que había más preguntas, así que puedes pasar el rato en la sala de discussion del orador en persona, que estará a la vuelta de la esquina justo fuera de la puerta, y si estás en una audiencia remota, puedes ir al spacial react advanced, eso es bit.ly forward slash spatial react advanced, para unirte a la conversación. Pero tienes una gran decisión que tomar. ¿Cuál fue tu pregunta favorita de todas las que viste? Esa sería la de las noches en vela. Noches en vela. Eso es muy amable de Gareth. Una muy buena pregunta, ¿verdad? Entonces Dave o DJ Amy, van a tener una camiseta. Si estás aquí en persona, solo ven al frente. Si estás en línea, nos pondremos en contacto contigo. Todos aplaudan por él, y definitivamente revisen su charla.

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
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Building Better Websites with Remix
Top Content
Remix is a new web framework from the creators of React Router that helps you build better, faster websites through a solid understanding of web fundamentals. Remix takes care of the heavy lifting like server rendering, code splitting, prefetching, and navigation and leaves you with the fun part: building something awesome!
React Advanced Conference 2023React Advanced Conference 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
Top Content
React provides a contract to developers- uphold certain rules, and React can efficiently and correctly update the UI. In this talk we'll explore these rules in depth, understanding the reasoning behind them and how they unlock new directions such as automatic memoization. 
React Advanced Conference 2022React Advanced Conference 2022
30 min
Using useEffect Effectively
Top Content
Can useEffect affect your codebase negatively? From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. In this talk, we'll demystify the useEffect hook and get a better understanding of when (and when not) to use it, as well as discover how declarative effects can make effect management more maintainable in even the most complex React apps.
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.

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
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
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.
React Advanced Conference 2021React Advanced Conference 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn