Bei SO ertappe ich mich oft dabei, dass ich kleine Codeabschnitte vergleiche, um zu sehen, welche Implementierung am schnellsten ist.
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
});
Weist diese Umsetzung irgendwelche Mängel auf? Ist sie gut genug, um zu zeigen, dass Implementierung X über Z Iterationen schneller ist als Implementierung Y? Fällt Ihnen etwas ein, was Sie verbessern könnten?
EDIT Seine ziemlich klar, dass eine Zeit-basierten Ansatz (im Gegensatz zu Iterationen), bevorzugt wird, hat jemand alle Implementierungen, wo die Zeitprüfungen nicht Auswirkungen Leistung?
0 Stimmen
Siehe auch BenchmarkDotNet .