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