Досить часто на 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 ітерації? Чи можете ви придумати будь-які способи, які б ви покращили?
EDIT Цілком очевидно, що кращим є підхід на основі часу (на відміну від ітерацій), чи має хто-небудь реалізація, де перевірка часу не впливає на ефективність?