Benchmarking małych próbek kodu w C #, czy można usprawnić tę implementację?

Dość często na SO uważam, że testuję małe porcje kodu, aby zobaczyć, która implementacja jest najszybsza.

Dość często widzę komentarze, że kod benchmarkingu nie uwzględnia jitting ani garbage collectora.

Mam następującą prostą funkcję benchmarkingu, którą powoli ewoluowałem:

<code>  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);
    }
</code>

Stosowanie:

<code>Profile("a descriptions", how_many_iterations_to_run, () =>
{
   // ... code being profiled
});
</code>

Czy ta implementacja ma jakieś wady? Czy to wystarczy, aby pokazać, że implementacja X jest szybsza niż implementacja Y nad iteracjami Z? Czy możesz pomyśleć o jakichkolwiek sposobach poprawy tego?

EDYTOWAĆ Jest całkiem jasne, że preferowane jest podejście oparte na czasie (w przeciwieństwie do iteracji), czy ktoś ma jakieś implementacje, w których kontrole czasu nie wpływają na wydajność?

questionAnswers(11)

yourAnswerToTheQuestion