经常在SO上我发现自己对一小段代码进行基准测试,以了解哪种实现速度最快。
我经常看到这样的评论,即基准测试代码未考虑到jitting或垃圾收集器。
我具有以下逐渐发展的简单基准测试功能:
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在Z迭代上比实现Y快?您能想到任何改善此方法的方法吗?
编辑 显然,基于时间的方法(而不是迭代)是首选,有人在时间检查不会影响性能的情况下实现吗?
梵蒂冈之花