Сравнительный анализ небольших примеров кода в C #, можно ли улучшить эту реализацию?
Довольно часто в SO я сравниваю небольшие куски кода, чтобы увидеть, какая реализация наиболее быстрая.
Довольно часто я вижу комментарии о том, что в бенчмаркинговом коде не учитывается джиттинг или сборщик мусора.
У меня есть следующая простая функция бенчмаркинга, которую я постепенно развивал:
<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>
Использование:
<code>Profile("a descriptions", how_many_iterations_to_run, () => { // ... code being profiled }); </code>
Есть ли в этой реализации недостатки? Достаточно ли хорошо, чтобы показать, что реализация X быстрее, чем реализация Y по Z итераций? Можете ли вы придумать, как бы вы могли это улучшить?
EDIT Совершенно очевидно, что предпочтителен подход, основанный на времени (в отличие от итераций), есть ли у кого-нибудь реализации, где проверки времени не влияют на производительность?