O primeiro parece uma otimização fácil que faz sentido, @david e @eviltrout dedicaram tempo à otimização dessa área, então ficarei muito curioso para ver o que eles pensam sobre isso.
O segundo parece um pouco mais frágil a longo prazo, entendo totalmente o desejo de otimizar, mas me preocupa um pouco, pois será uma área que precisaremos manter.
Olá @rrit - obrigado pelos PRs. O primeiro parece uma boa melhoria. Você conseguiu medir o impacto no desempenho? Quanto tempo ele economiza?
Como @sam disse, a manutenibilidade do segundo é um pouco preocupante. Parece que é um copiar/colar do código fonte do Ember? Você mudou algo para melhorar o desempenho?
Por exemplo, renderTopicListItem aciona muitas chamadas de _getPath (mais 50-100 ms para economizar): Firefox Profiler (callstack filtrado para _getPath dentro de renderTopicListItem)
Talvez as chamadas caras para _getPath sejam algo a ser otimizado em Ember.js e não em Discourse.
E confira o Firefox Profiler para obter informações sobre a execução de JavaScript:
Infelizmente, não consegui replicar esse grande aumento de velocidade. No Firefox e Chrome (macOS), não estou vendo nenhuma melhoria mensurável. O Chrome gasta cerca de 23ms em renderTopicListItem. O Firefox 30ms. Em um dispositivo Android mais antigo (Pixel 3), estou vendo cerca de 108ms. Os números não parecem mudar antes/depois da alteração.
A propósito, medi esses números usando a API de performance. Adicionei performance.mark("rtli-start") no início de renderTopicListItem, e então performance.measure("rtli", "rtli-start") no final.
Em seguida, recarreguei o navegador com as ferramentas de desenvolvedor fechadas e plugins do navegador desativados (ferramentas de desenvolvedor e plugins do navegador podem afetar significativamente o desempenho de renderização). Então, após o carregamento ser concluído, abri as ferramentas de desenvolvedor e executei isso para somar as medições:
performance.getEntriesByName("rtli").reduce((v, m) => v + m.duration, 0);
Com certeza vamos mesclar essa alteração - é claramente uma implementação melhor. Mas não tenho certeza se ela nos dará uma diferença visível no desempenho de renderização
Minha instância de teste do Discourse tem muitos tópicos com muitas respostas e muitos autores diferentes - dados extraídos de uma instância produtiva. Isso resulta em muitos elementos para serem renderizados.
Talvez essa seja a diferença em nossos benchmarks?
Pré-renderização de conteúdo abaixo da dobra
O Discourse pré-renderiza 30 tópicos na página ‘latest’. Em seguida, o conteúdo é exibido pela primeira vez (FCP). Acima da dobra, apenas ~12 tópicos são visíveis.
O mesmo para uma página de tópico: 20 posts pré-renderizados, mas no máximo 6 posts de uma linha são visíveis acima da dobra.
Você se importaria de compartilhar as versões do Firefox e do sistema operacional? O número de 290ms é quase 3x mais lento do que um dispositivo Android de 2018, o que é um pouco surpreendente.
Isso pode explicar parte da diferença, sim. No meu caso, eu os executei usando dados ao vivo do Meta:
bin/ember-cli --environment production --proxy https://meta.discourse.org
Sim, esta é uma melhoria possível. No entanto, precisaremos ter muito cuidado para que o layout e/ou a rolagem não saltem (por exemplo, se o usuário estiver atualizando a página quando já estiver rolado até a metade). A definição de ‘abaixo da dobra’ também varia com base no dispositivo/navegador/tema.
Discourse Build Error
Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames:
Host: localhost. is not in the cert's altnames: DNS:*.cdck-prod-meta.discourse.cloud
Discourse Build Error
Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames:
Host: meta.discourse.org. is not in the cert's altnames: DNS:*.cdck-prod-meta.discourse.cloud
Sistema usado para benchmarks
Extraído do about:support do Firefox
Nome
Firefox
Versão
95.0.2
Build-ID
20211219102529
Distributions-ID
canonical-002
User-Agent
Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0
Sistema Operacional
Linux 5.10.0-0.bpo.9-amd64 #1 SMP Debian 5.10.70-1~bpo10+1 (2021-10-10)
Tema do Sistema Operacional
Adwaita-dark / Adwaita
Arquivo do Programa
/snap/firefox/777/usr/lib/firefox/firefox
Nome
Firefox Developer Edition
Versão
96.0b10
Build-ID
20211228195952
Diretório de Atualização
/opt/firefox-dev-autoinstall
Canal de Atualização
aurora
User-Agent
Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Sistema Operacional
Linux 5.10.0-0.bpo.9-amd64 #1 SMP Debian 5.10.70-1~bpo10+1 (2021-10-10)