El primero parece una optimización sencilla que creo que tiene sentido, @david y @eviltrout dedicaron tiempo a optimizar esta área, así que tendré mucha curiosidad por ver qué piensan al respecto.
El segundo se siente un poco más frágil a largo plazo, entiendo totalmente el deseo de optimizar, pero me preocupa un poco porque será un área que necesitaremos mantener.
Hola @rrit: gracias por las PR. La primera parece una buena mejora. ¿Pudiste medir el impacto en el rendimiento? ¿Cuánto tiempo ahorra?
Como dijo @sam, la mantenibilidad de la segunda es un poco preocupante. ¿Parece una copia/pega del código fuente de Ember? ¿Cambiaste algo para mejorar el rendimiento?
Por ejemplo, renderTopicListItem finalmente activa muchas llamadas a _getPath (otros 50-100 ms que ahorrar): Firefox Profiler (callstack filtrado a _getPath dentro de renderTopicListItem)
Quizás las llamadas costosas a _getPath sean algo a optimizar en Ember.js y no en Discourse.
Y echa un vistazo a Firefox Profiler para obtener información sobre la ejecución de JavaScript:
Desafortunadamente, no he podido replicar este gran aumento de velocidad. En Firefox y Chrome (macOS) no veo ninguna mejora medible. Chrome gasta alrededor de 23 ms en renderTopicListItem. Firefox 30 ms. En un dispositivo Android antiguo (Pixel 3), veo alrededor de 108 ms. Los números no parecen cambiar antes/después del cambio.
Por cierto, medí estos números usando la API de rendimiento. Añadí performance.mark("rtli-start") al principio de renderTopicListItem, y luego performance.measure("rtli", "rtli-start") al final.
Luego recargo el navegador con las herramientas de desarrollador cerradas y los complementos del navegador deshabilitados (las herramientas de desarrollador y los complementos del navegador pueden afectar significativamente el rendimiento de renderizado). Luego, después de que la carga se complete, abro las herramientas de desarrollador y ejecuto esto para sumar las mediciones:
performance.getEntriesByName("rtli").reduce((v, m) => v + m.duration, 0);
Definitivamente fusionaremos este cambio, es claramente una mejor implementación. Pero no estoy seguro de si nos dará una diferencia visible en el rendimiento de renderizado
Mi instancia de prueba de Discourse tiene muchos temas con muchas respuestas y muchos autores diferentes: datos extraídos de una instancia productiva. Esto da como resultado muchos elementos para renderizar.
¿Quizás esta sea la diferencia en nuestros benchmarks?
Pre-renderizado de contenido debajo del pliegue
Discourse pre-renderiza 30 temas en la página ‘latest’. Luego, el contenido se muestra por primera vez (FCP). Encima del pliegue solo son visibles ~12 temas.
Lo mismo para una página de tema: se pre-renderizan 20 publicaciones, pero como máximo 6 publicaciones de una línea son visibles encima del pliegue.
Este podría ser otro punto de optimización para FCP.
¿Podrías compartir la versión de Firefox y del sistema operativo? El número de 290 ms es casi 3 veces más lento que un dispositivo Android de 2018, lo cual es un poco sorprendente.
Eso podría explicar parte de la diferencia, sí. En mi caso, los ejecuté usando datos en vivo de Meta:
bin/ember-cli --environment production --proxy https://meta.discourse.org
Sí, esta es una posible mejora. Sin embargo, tendremos que tener mucho cuidado de que el diseño y/o el desplazamiento no salten (por ejemplo, si el usuario actualiza la página cuando ya está desplazado hasta la mitad). La definición de ‘debajo del pliegue’ también varía según el dispositivo/navegador/tema.
Discourse Build Error
Error [ERR_TLS_CERT_ALTNAME_INVALID]: El nombre de host/IP no coincide con los nombres alternativos del certificado:
Host: localhost. no está en los nombres alternativos del certificado: DNS:*.cdck-prod-meta.discourse.cloud
Discourse Build Error
Error [ERR_TLS_CERT_ALTNAME_INVALID]: El nombre de host/IP no coincide con los nombres alternativos del certificado:
Host: meta.discourse.org. no está en los nombres alternativos del certificado: DNS:*.cdck-prod-meta.discourse.cloud
Sistema utilizado para las pruebas de rendimiento
Extraído de Firefox about:support
Nombre
Firefox
Versión
95.0.2
ID de compilación
20211219102529
ID de distribución
canonical-002
User-Agent
Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0
Sistema operativo
Linux 5.10.0-0.bpo.9-amd64 #1 SMP Debian 5.10.70-1~bpo10+1 (2021-10-10)
Tema del sistema operativo
Adwaita-dark / Adwaita
Archivo del programa de aplicación
/snap/firefox/777/usr/lib/firefox/firefox
Nombre
Firefox Developer Edition
Versión
96.0b10
ID de compilación
20211228195952
Directorio de actualización
/opt/firefox-dev-autoinstall
Canal de actualización
aurora
User-Agent
Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Sistema operativo
Linux 5.10.0-0.bpo.9-amd64 #1 SMP Debian 5.10.70-1~bpo10+1 (2021-10-10)