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?