Fala galera,
Hoje venho trazendo uma nova ferramenta que pode nos ajudar a medir a performance da nossa aplicação ao longo do tempo. Essa ferramenta é o NBench.
NBench é um framework de teste de desempenho no qual podemos medir o desempenho de um determinado método e assim garantir que qualquer refatoração ao longo do tempo aponte para possíveis problemas de desempenho
Então, o que queremos fazer é escrever algum teste de unidade baseado em uma diretriz de desempenho em torno de um método e apontar se o método está lento ou se um método crítico onde o desempenho deve ter um determinado nível, ou seja, o método deve ser completo em menos do que x ms.
NBench é muito mais do que apenas um cronômetro / temporizador. Nele podemos comparar o uso da memória, o GC e outros contadores.
Vamos ao exemplo
Nosso cenário é criar um teste de desempenho clássico, ou seja, testar o como é rápido um método. Então, vamos escrever um código e assim analisa-lo com o NBench e ver como as coisas se encaixam. Para isso vamos criar:
- Um projeto de Class Library
- Adicionar o Pacote do NBench (install-package nbench)
- Adicionar o Runner do NBench (install-package nbench.runner)
Vamos criar uma simples classe que adiciona um objeto no cache
public class WebCache<T> { private readonly List<T> cache = new List<T>(); public void Add(T item) { if (!Contains(item)) cache.Add(item); } public bool Contains(T item) { return cache.Contains(item); } }
Agora vamos escrever nosso teste com o NBench
public class WebCacheTest { WebCache<String> Cache { get; set; } = new WebCache<string>(); [PerfBenchmark(NumberOfIterations = 1, RunMode = RunMode.Throughput, TestMode = TestMode.Test, SkipWarmups = true)] [ElapsedTimeAssertion(MaxTimeMilliseconds = 2000)] public void WebCahe_Performance_Tests() { for (int i = 0; i < 100_000; i++) { Cache.Add(i.ToString()); } } }
Para testar, devemos executar o Nbench.Runner, conforme figura abaixo. Eu estou usando o cmder mas fique a vontade para usar o prompt de sua preferência.
Como podemos ver, nosso teste passou e o NBench traz todas as informações em uma pagina de resultado. Tudo isso configurável conforme as suas necessidades.
O NBench traz uma lista de assertions no qual podemos utilizar para medir a performance.
- MemoryAssertionAttribute – baseado na memória alocada
- GcTotalAssertionAttribute – baseado no Garbage Collector (GC)
- ElapsedTimeAssertionAttribute – baseado no total de tempo que um método executa
- CounterTotalAssertionAttribute – baseado em um contador
- GcThroughputAssertionAttribute – baseado na média de throughput do Garbage Collector (GC)
- PerformanceCounterTotalAssertionAttribute – baseado na média de contadores de performance
Também podemos integrar o NBench em um Build Server, assim podemos executar os testes de performance e ter os resultados em tempo real.
Para saber mais sobre o NBench, clique aqui e veja a sua documentação
Abs e até a próxima.