Benchmarking
BenchmarkDotNet, diagnosticos de memoria, analise estatistica e comparacao de abordagens
Nunca use Stopwatch para benchmarking serio. BenchmarkDotNet cuida de warmup, eliminacao de outliers, analise estatistica, alocacoes de memoria e GC. Um
Stopwatch mede uma execucao β BenchmarkDotNet mede centenas com rigor cientifico e gera relatorios comparativos. Pipeline do BenchmarkDotNet
Quando voce roda um benchmark, o BenchmarkDotNet executa uma pipeline sofisticada para garantir resultados confiaveis. Cada etapa e crucial para eliminar ruido e produzir medicoes estatisticamente validas.
Por que nao usar Stopwatch?
| Problema | Stopwatch | BenchmarkDotNet |
|---|---|---|
| Warmup / JIT | Nao faz β primeira execucao inclui JIT | Warmup automatico ate estabilizar |
| Outliers | Inclui todos (GC, context switch) | Detecta e remove outliers estatisticos |
| Analise estatistica | Nenhuma | Mean, median, StdDev, CI |
| Alocacao de memoria | Nao mede | Bytes alocados, Gen0/1/2 collections |
| GC Pressure | Ignora | Conta collections por geracao |
| Reproducibilidade | Varia muito entre execucoes | Desvio padrao explicito |
| Comparacao | Manual | Tabela comparativa, ratios, baseline |
Metricas do BenchmarkDotNet
| Metrica | Descricao | Importancia |
|---|---|---|
Mean | Media aritmetica de todas as iteracoes | Referencia principal de tempo |
Median | Valor do meio (robusto contra outliers) | Melhor que Mean quando ha outliers |
StdDev | Desvio padrao β dispersao dos resultados | StdDev alto = resultado instavel |
Error | Metade do intervalo de confianca de 99.9% | Margem de erro da medicao |
Allocated | Bytes alocados no managed heap por operacao | Diretamente proporcional a pressao no GC |
Gen0/Gen1/Gen2 | Numero de GC collections por 1000 operacoes | Gen2 = problema serio de memoria |
Ratio | Comparacao relativa ao baseline | Ex: 0.5x = 2x mais rapido que baseline |
Por que nao usar Stopwatch para benchmarking?
Stopwatch mede wall-clock time de uma unica execucao. A primeira execucao inclui JIT compilation, que pode ser 10-100x mais lenta. Nao elimina outliers causados por GC, context switches ou background processes. Nao mede alocacoes de memoria nem pressao no GC. Nao faz analise estatistica β voce nao sabe se a diferenca entre duas abordagens e real ou ruido. BenchmarkDotNet resolve tudo isso: warmup, iteracoes multiplas, estatistica, diagnosticos de memoria e relatorios comparativos. E a diferenca entre "acho que e mais rapido" e "comprovadamente e 3.2x mais rapido com 95% de confianca". O que BenchmarkDotNet mede que timing manual nao mede?
Alem de tempo preciso (com warmup e eliminacao de JIT overhead), mede: alocacoes de memoria (bytes por operacao), GC collections por geracao (Gen0/Gen1/Gen2), desvio padrao para saber se o resultado e estavel, intervalo de confianca para saber a margem de erro, e ratios automaticos para comparar abordagens. Tambem suporta disassembly (mostra o assembly/IL gerado), hardware counters, e exportacao para CSV/JSON/Markdown.