Testes de desempenho em nível de código

Tenho analisado o desempenho do plugin ActivityPub recentemente e considerado as melhores formas de testar e comprovar de forma confiável o desempenho para o propósito de tal projeto. Aqui estão algumas informações iniciais:

  • O plugin é um projeto de código aberto com várias partes envolvidas (ou seja, Discourse, que é o proprietário do plugin, e Pavilion, que o está desenvolvendo atualmente).
  • Partes diferentes podem ter ferramentas/sistemas internos de teste de desempenho diferentes.
  • Projetos de código aberto multipartidários beneficiam-se de métodos comumente disponíveis para testar e comprovar que algo funciona, ou neste caso, tem um desempenho confiável.
  • O Discourse (louvavelmente) se preocupa com o desempenho.

No Discourse, acreditamos que o desempenho é um recurso. Damos as boas-vindas a pull requests que melhoram o desempenho do lado do cliente ou do servidor.

Para um exemplo recente do uso de track_sql_queries, veja

Se você está familiarizado com esta área, provavelmente sabe algo como

A regra geral é que testes unitários precisam de velocidade e testes de desempenho precisam de tempo.

(citação de este explicador decente)

O que, à primeira vista, pode tornar o teste de desempenho (além da contagem de consultas) um tanto difícil de integrar a uma suíte rspec (ou similar). Dito isso, algumas pessoas tentam

Estou curioso sobre quais outros métodos práticos, sugestões ou ideias as pessoas podem ter para adicionar testes de desempenho e comprovações de desempenho mais comumente disponíveis ao ecossistema Discourse. Ou se existem métodos ou abordagens que não mencionei aqui. Eu enfatizaria as palavras “prático” e “comumente disponível” aí.

Um pensamento que ocorre é que seria possível usar o MiniProfiler em um spec, ou seja, algo como Rack::MiniProfiler.profile_singleton_method. Mas eu nem tentei isso, nem sei se seria uma boa ideia.

7 curtidas

Minha recomendação geral é evitar testes de desempenho em especificações.

Temos alguns exemplos em que tentamos monitorar N+1 em uma especificação, mas todos eles tendem a ser bastante frágeis.

É um problema muito, muito difícil, sem solução óbvia. Todas as soluções vêm com compromissos, então geralmente evitamos isso e apenas monitoramos a produção para esse tipo de coisa.

1 curtida