我写了一些常用的方法,我发现性能非常重要。在进行了一些更改以修复明显的性能错误之后,我喜欢进行一些测试以验证性能不会因将来的更改而下降。但是,我发现这些测试通常非常不稳定(可能是由于垃圾收集,我们的自动测试服务器上的其他活动等)。我想知道的是,是否有公认的最佳实践来编写和维护这些类型的测试?
到目前为止,我的大多数测试如下所示:
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 次未通过基准测试时才失败。
查看本文:了解如何创建正确的 C# 基准测试。案例的主要提示:
-
您应该使用处理器缓存预热来获得更正的结果
-
您应该在单个处理器上运行代码 (
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1)
) -
您应该为线程和进程设置高优先级
-
您应该在基准测试之前运行
GC.Collect()
-
您应该多次运行基准测试并获取结果的中位数
你也可以使用这个免费的开源.NET框架来创建足够的基准:BenchmarkDotNet。
您使用的是Visual Studio还是mono develop,但是您可以使用Speed Profiler工具,例如:
红门:http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/?utm_source=google&utm_medium=cpc&utm_content=unmet_need&utm_campaign=antsperformanceprofiler&gclid=CPfS1Z_k1bkCFYuk4Aoda3oAVg
或使用默认的 Visual Studio 性能探查器。 请参阅本教程:http://msdn.microsoft.com/en-us/library/ms182372.aspx(互联网上有更多内容)。