Cukup sering di SO saya mendapati diri saya melakukan benchmarking pada potongan-potongan kecil kode untuk melihat implementasi mana yang tercepat.
Cukup sering saya melihat komentar bahwa kode pembandingan tidak memperhitungkan jitting atau pengumpul sampah.
Saya memiliki fungsi pembandingan sederhana berikut yang perlahan saya kembangkan:
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);
}
Pemakaian:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Apakah penerapan ini memiliki kekurangan? Apakah cukup baik untuk menunjukkan bahwa implementasi X lebih cepat daripada implementasi Y melalui iterasi Z? Dapatkah Anda memikirkan cara untuk meningkatkan ini?
EDIT Cukup jelas bahwa pendekatan berbasis waktu (sebagai lawan dari iterasi), lebih disukai, apakah ada yang memiliki implementasi di mana pemeriksaan waktu tidak mempengaruhi kinerja?