Molto spesso su SO mi ritrovo a fare il benchmarking di piccoli blocchi di codice per vedere quale implementazione è più veloce.
Spesso vedo commenti che il codice di benchmarking non tiene conto del jitting o del garbage collector.
Ho la seguente semplice funzione di benchmarking che ho lentamente evoluto:
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
});
Questa implementazione ha qualche difetto? È abbastanza buono per mostrare che l'implementazione X è più veloce dell'implementazione Y su Z iterazioni? Riesci a pensare a qualche modo per migliorarlo?
EDIT È abbastanza chiaro che un approccio basato sul tempo (al contrario delle iterazioni) è preferito, qualcuno ha implementazioni in cui i controlli del tempo non influiscono sulle prestazioni?