1

我写了一些常用的方法,我发现性能非常重要。在进行了一些更改以修复明显的性能错误之后,我喜欢进行一些测试以验证性能不会由于未来的更改而降低。但是,我发现这些测试通常非常不稳定(可能是由于垃圾收集、我们的自动化测试服务器上的其他活动等)。我想知道的是,编写和维护此类测试是否有公认的最佳实践?

到目前为止,我的大多数测试如下所示:

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 次未通过基准测试时才会失败。

4

2 回答 2

3

看这篇文章:了解如何创建正确的 C# 基准。您的案例的主要提示:

  • 您应该使用处理器缓存的预热来获得更正的结果

  • 您应该在单个处理器上运行代码 ( Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1))

  • 您应该为线程和进程设置高优先级

  • 您应该GC.Collect()在基准测试之前运行

  • 您应该多次运行基准测试并取结果的中位数

    您也可以使用这个免费的开源 .NET 框架来创建足够的基准:BenchmarkDotNet

于 2013-09-18T20:29:08.817 回答
1

我不知道您使用的是visual studio还是mono develop,但您可以使用速度分析器工具,例如:

RedGate: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(互联网上的更多内容)。

于 2013-09-18T20:31:04.613 回答