Sehr oft finde ich mich bei SO dabei, kleine Codestücke zu vergleichen, um festzustellen, welche Implementierung am schnellsten ist.
Sehr oft sehe ich Kommentare, dass der Benchmarking-Code das Jitting oder den Garbage Collector nicht berücksichtigt.
Ich habe die folgende einfache Benchmarking-Funktion, die ich langsam weiterentwickelt habe:
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);
}
Verwendung:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Hat diese Implementierung irgendwelche Mängel? Ist es gut genug zu zeigen, dass die Implementierung X über Z-Iterationen schneller ist als die Implementierung Y? Können Sie sich Möglichkeiten vorstellen, wie Sie dies verbessern können?
BEARBEITEN Es ist ziemlich klar, dass ein zeitbasierter Ansatz (im Gegensatz zu Iterationen) bevorzugt wird. Hat jemand Implementierungen, bei denen die Zeitprüfungen keinen Einfluss auf die Leistung haben?