Usando o 'tachometer' do Google para medir mudanças de desempenho em JS no Discourse

Ao trabalhar em tarefas do lado do cliente no núcleo, plugins ou temas do Discourse, é importante considerar o impacto no desempenho. O projeto ‘Tachometer’ da Google fornece uma ferramenta de benchmarking estatisticamente rigorosa que podemos usar para medir definitivamente o efeito das alterações.

Basicamente, essa ferramenta recebe uma lista de URLs e as carrega de forma ‘round-robin’ (alternada). Para cada carregamento de página, ela realiza uma medição de desempenho. Após centenas ou milhares de iterações, ela produz uma tabela de comparação.

A beleza dessa abordagem ‘round-robin’ é que ela ajuda a reduzir o impacto de fatores externos nas medições.

Etapa 1: Adicionar performance.measure()

A abordagem aqui variará com base no que você está testando. Mas fundamentalmente: você precisa introduzir um valor de performance.measure() para o Tachometer ler.

Se você quiser medir o tempo que o Discourse leva para iniciar e renderizar, pode usar a medição integrada “discourse-init-to-paint”. Para qualquer outra coisa, você pode introduzir seu próprio performance.measure e usá-lo.

Você pode verificar se está funcionando usando a aba de desempenho nas ferramentas de desenvolvimento do seu navegador:

Se você estiver tentando medir uma atividade que requer interação do usuário (por exemplo, abrir um menu), você pode alcançar isso adicionando algo como o seguinte em um inicializador para clicar no botão 1 segundo após a página ser carregada:

setTimeout(() => document.querySelector(".my-button").click(), 1000);

Etapa 2: Identificar URLs para teste

Primeiro, certifique-se de que você está compilando os assets do Ember em modo de produção. Isso pode ser feito iniciando o servidor com EMBER_ENV=production.

Para obter duas URLs diferentes, existem duas abordagens principais:

Se sua alteração for pequena o suficiente para ser facilmente controlada por uma bandeira de recurso (feature flag), você pode adicionar lógica para alterná-la com base em um parâmetro de consulta da URL. Então, suas duas URLs seriam:

http://localhost:3000?flag=antes
http://localhost:3000?flag=depois

Se a alteração for grande demais para isso, você pode clonar o Discourse em um segundo diretório e iniciar uma segunda cópia do rails.

EMBER_ENV=production UNICORN_PORT=3001 bin/dev

E então suas duas URLs seriam:

http://localhost:3000
http://localhost:3001

Se você seguir essa abordagem, certifique-se de que ambas as cópias do aplicativo tenham a telemetria de desempenho que você introduziu na etapa 1 deste guia.

Etapa 3: Configurar o Tachometer

Este é meu arquivo bench.json, que coletará 300 amostras de cada alvo:

{
  "timeout": 5,
  "sampleSize": 300,
  "benchmarks": [
    {
      "measurement": {
        "mode": "performance",
        "entryName": "discourse-init-to-paint"
      },
      "expand": [
        {
          "url": "http://localhost:3000",
          "name": "antes"
        },
        {
          "url": "http://localhost:3001",
          "name": "depois"
        }
      ]
    }
  ]
}

Etapa 4: Executar o benchmark

Para reduzir o ruído, pare qualquer atividade não relacionada na sua estação de trabalho e, em seguida, inicie o benchmark com um comando como:

npx tachometer@latest --config ./bench.json

Ao concluir, você deve ver uma comparação do desempenho antes/depois.

Ressalvas

Como em qualquer experimento desse tipo, vale a pena considerar as limitações. Por exemplo:

  • Diferenças de desempenho na sua estação de desenvolvimento podem não se traduzir diretamente para outros navegadores/dispositivos

  • O processo de inicialização do Discourse através do proxy do Ember-CLI não é exatamente o mesmo que em produção. Ao fazer alterações estruturais (por exemplo, atualizações de framework), isso pode ser importante

  • O desempenho frequentemente varia com base no estado da aplicação (por exemplo, o número de tópicos sendo renderizados), então seus resultados podem não ser exatamente reproduzíveis em outros ambientes


Este documento é controlado por versão - sugira alterações no github.

17 Curtiram