Comparando amostras de códigos pequenos em C #, esta implementação pode ser melhorada?

Muitas vezes, em SO, encontro-me comparando pequenos trechos de código para ver qual implementação é mais rápida.

Muitas vezes vejo comentários de que o código de benchmarking não leva em conta o jitter ou o coletor de lixo.

Eu tenho a seguinte função de benchmarking simples que desenvolvi lentamente:

<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>

Uso:

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

Esta implementação tem alguma falha? É bom o suficiente mostrar que a implementação X é mais rápida que a implementação Y sobre as iterações Z? Você consegue pensar em alguma maneira de melhorar isso?

EDITAR É bastante claro que uma abordagem baseada no tempo (em oposição a iterações) é preferida. Alguém tem implementações onde as verificações de tempo não afetam o desempenho?

questionAnswers(11)

yourAnswerToTheQuestion