Dość często w SO zdaję sobie sprawę, że porównuję małe fragmenty kodu, aby zobaczyć, która implementacja jest najszybsza.
Dość często widzę komentarze, że kod benchmarkingu nie bierze pod uwagę jittingu ani garbage collectora.
Mam następującą prostą funkcję benchmarkingu, którą powoli ewoluowałem:
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);
}
Stosowanie:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Czy ta implementacja ma jakieś wady? Czy wystarczy pokazać, że implementacja X jest szybsza niż implementacja Y przez iteracje Z? Czy możesz wymyślić jakiś sposób, w jaki mógłbyś to poprawić?
EDYCJA Jest całkiem jasne, że preferowane jest podejście oparte na czasie (w przeciwieństwie do iteracji), czy ktoś ma jakieś implementacje, w których sprawdzanie czasu nie wpływa na wydajność?