我写了一些常用的方法,我发现性能非常重要。在进行了一些更改以修复明显的性能错误之后,我喜欢进行一些测试以验证性能不会由于未来的更改而降低。但是,我发现这些测试通常非常不稳定(可能是由于垃圾收集、我们的自动化测试服务器上的其他活动等)。我想知道的是,编写和维护此类测试是否有公认的最佳实践?
到目前为止,我的大多数测试如下所示:
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 次未通过基准测试时才会失败。