Evaluando ejemplos de código pequeño en C #, ¿se puede mejorar esta implementación?

Muy a menudo, SO me encuentro comparando pequeños trozos de código para ver qué implementación es más rápida.

Muy a menudo veo comentarios que el código de evaluación comparativa no tiene en cuenta 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
});

¿Esta implementación tiene fallas? ¿Es lo suficientemente bueno como para demostrar que la implementación X es más rápida que la implementación Y sobre las iteraciones Z? ¿Se te ocurre alguna forma de mejorar esto?

EDITAR&nbsp;Es bastante claro que se prefiere un enfoque basado en el tiempo (a diferencia de las iteraciones). ¿Alguien tiene implementaciones en las que los controles de tiempo no afecten el rendimiento?