我已经写了一些常用的方法,我发现性能非常重要。在进行了一些修改以修复明显的性能错误后,我想进行一些测试以验证性能不会因未来的更改而降低。但是,我发现这些测试通常非常不稳定(可能是由于垃圾收集,我们的自动测试服务器上的其他活动等)。我想知道的是,是否有一种可接受的最佳实践来编写和维护这些类型的测试?
到目前为止,我的大多数测试看起来如下:
runMyCode(); // for assembly loading/jitting
var sw = Stopwatch.StartNew();
for (iterations) { runMyCode(); }
var time = sw.Elapsed;
// then either
Assert.Less(time, TimeSpan.FromSeconds(some reasonably generous amount of time));
// or
// time some other piece of benchmark code (e. g. a framework method
// which runMyCode() layers on top of). And do:
Assert.Less(time.TotalSeconds, someMultiplier * benchmarkTime.TotalSeconds);
我认为必须提高稳定性的一个想法是让测试存储在数据库中记录时间,并且只有在最后N次失败基准测试时才会失败。
答案 0 :(得分:2)
看看这篇文章:Learn how to create correct C# benchmarks。案例的主要提示:
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1)
)GC.Collect()
您应该多次运行基准测试并取结果中位数
此外,您可以使用这个免费的开源.NET框架来创建足够的基准:BenchmarkDotNet。
答案 1 :(得分:1)
我不知道您是使用visual studio还是单声道开发,但您可以使用速度分析器工具,如:
或使用默认的visual studio性能分析器。请参阅本教程:http://msdn.microsoft.com/en-us/library/ms182372.aspx(在互联网上还有更多内容)。