Достаточно часто на 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 итерациям? Можете ли вы придумать, как бы это улучшить?
РЕДАКТИРОВАТЬ Совершенно очевидно, что предпочтительнее использовать подход, основанный на времени (в отличие от итераций), есть ли у кого-нибудь реализации, в которых проверки времени не влияют на производительность?