Assez souvent sur SO, je me retrouve à comparer de petits morceaux de code pour voir quelle implémentation est la plus rapide.
Très souvent, je vois des commentaires selon lesquels le code d'analyse comparative ne prend pas en compte le jitting ou le garbage collector.
J'ai la fonction d'analyse comparative simple suivante que j'ai lentement évoluée:
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);
}
Usage:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Cette implémentation présente-t-elle des défauts? Est-ce suffisant pour montrer que l'implémentation X est plus rapide que l'implémentation Y sur les itérations Z? Pouvez-vous penser à des moyens d'améliorer cela?
EDIT Il est assez clair qu'une approche basée sur le temps (par opposition aux itérations), est préférée, est-ce que quelqu'un a des implémentations où les vérifications du temps n'ont pas d'impact sur les performances?