Muy a menudo en SO me encuentro comparando pequeños fragmentos de código para ver qué implementación es más rápida.
Muy a menudo veo comentarios de que el código de evaluación comparativa no tiene en cuenta el jitting o el recolector de basura.
Tengo la siguiente función de evaluación comparativa simple que he evolucionado 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
});
¿Tiene esta implementación algún defecto? ¿Es lo suficientemente bueno para mostrar que la implementación X es más rápida que la implementación Y en las iteraciones Z? ¿Puedes pensar en alguna forma de mejorar esto?
EDITAR Está bastante claro que se prefiere un enfoque basado en el tiempo (a diferencia de las iteraciones), ¿alguien tiene alguna implementación en la que las verificaciones de tiempo no afecten el rendimiento?