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.

Write BenchmarkRun BenchmarkDotNetWarmupJIT + estabilizacaoMeasurementN iteracoesStatistical AnalysisMean, StdDev, CIReportTabela + export

Por que nao usar Stopwatch?

ProblemaStopwatchBenchmarkDotNet
Warmup / JITNao faz β€” primeira execucao inclui JITWarmup automatico ate estabilizar
OutliersInclui todos (GC, context switch)Detecta e remove outliers estatisticos
Analise estatisticaNenhumaMean, median, StdDev, CI
Alocacao de memoriaNao medeBytes alocados, Gen0/1/2 collections
GC PressureIgnoraConta collections por geracao
ReproducibilidadeVaria muito entre execucoesDesvio padrao explicito
ComparacaoManualTabela comparativa, ratios, baseline

Metricas do BenchmarkDotNet

MetricaDescricaoImportancia
MeanMedia aritmetica de todas as iteracoesReferencia principal de tempo
MedianValor do meio (robusto contra outliers)Melhor que Mean quando ha outliers
StdDevDesvio padrao β€” dispersao dos resultadosStdDev alto = resultado instavel
ErrorMetade do intervalo de confianca de 99.9%Margem de erro da medicao
AllocatedBytes alocados no managed heap por operacaoDiretamente proporcional a pressao no GC
Gen0/Gen1/Gen2Numero de GC collections por 1000 operacoesGen2 = problema serio de memoria
RatioComparacao relativa ao baselineEx: 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.