Freqüentemente, no SO, eu me pego comparando pequenos pedaços de código para ver qual implementação é mais rápida.
Frequentemente vejo comentários de que o código de benchmarking não leva em conta o jitting ou o coletor de lixo.
Tenho a seguinte função de benchmarking simples, que evoluí lentamente:
static void Profile(string description, int iterations, Action func) {
// warm up
func();
// clean up
GC.Collect();
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
Uso:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Esta implementação tem alguma falha? É bom o suficiente para mostrar que a implementação X é mais rápida do que a implementação Y em iterações Z? Você pode pensar em alguma maneira de melhorar isso?
EDITAR É bastante claro que uma abordagem baseada no tempo (em oposição às iterações) é preferida. Alguém tem alguma implementação em que as verificações de tempo não afetam o desempenho?