Performance 性能规则测试的正确做法是什么?

Performance 性能规则测试的正确做法是什么?,performance,unit-testing,version-control,integration-testing,qa,Performance,Unit Testing,Version Control,Integration Testing,Qa,我知道我们所做的是不正确/奇怪的做法 我们在应用程序中有一个在许多地方构造的对象,其构造的滞后会严重影响我们的性能 我们需要一个门来阻止对该结构的性能产生不利影响的签入… 我们所做的是创建一个单元测试,基本上如下所示: myStopwatch.StartNew() newMyObject = New myObject() myStopwatch.Stop() Assert(myStopwatch.ElapsedMilliseconds < 100) myStopwatch.StartNe

我知道我们所做的是不正确/奇怪的做法

我们在应用程序中有一个在许多地方构造的对象,其构造的滞后会严重影响我们的性能

我们需要一个门来阻止对该结构的性能产生不利影响的签入…
我们所做的是创建一个单元测试,基本上如下所示:

myStopwatch.StartNew()
newMyObject = New myObject()
myStopwatch.Stop()
Assert(myStopwatch.ElapsedMilliseconds < 100)
myStopwatch.StartNew()
newMyObject=新myObject()
myStopwatch.Stop()
断言(myStopwatch.elapsedmillesons<100)
或者:如果构建时间超过100ms,则失败

如果签入对性能的影响太负面,那么它就不会提交。。。然而,它本质上是一个糟糕的单元测试,因为它可能会间歇性地失败。。。例如,如果我们的构建服务器由于任何原因而运行缓慢

编辑:回应部分答案;我们明确希望我们的门拒绝影响此性能的签入,我们不希望检查日志或观察数据趋势

问题:

衡量签入门性能的正确方法是什么?

首先,我想说:您不能允许一些逻辑延迟运行,而不是在构造函数/初始化中执行所有逻辑吗?或者可以对对象进行分区吗?这方面的一个有用指标是

其次,您可以缓存这些实例吗?在上一个项目中,我们遇到了类似的情况,我们决定将对象缓存几分钟。这带来了其他一些小问题,但应用程序的性能一路飙升

最后,我确实认为这是一个很好的方法,但我会取一个平均值,而不仅仅是一个样本(操作系统可能只是在那个时候决定运行其他东西,可能需要100毫秒以上)。 此外,这种方法的一个问题是,如果您更新了硬件,但忘记了更新,您可能会添加更多的逻辑,而没有意识到这一点


我认为更好的方法是存储运行N次迭代所需的时间,如果该值增加超过X%,那么构建将失败,但实现起来更为棘手。这样做的好处是,由于您存储了所需的时间,因此您可以从中生成一个图表并查看趋势

我认为您不应该以阻止签入的方式执行此操作,因为在签入过程中要做的工作太多了。签入需要很快,因为开发人员在运行时不能做任何其他事情

这个单元测试必须在开发人员坐着等待的时候编译和运行。正如您指出的,测试的一次迭代不足以产生一致的结果。它需要运行多少次才能可靠?10? 运行10次迭代将使签入时间最多增加1秒,但在我看来仍然不够可靠。如果您将其增加到100次迭代,您将获得更好的结果,但这将使签入时间增加10秒

另外,如果两个开发人员同时签入代码会发生什么情况?第二个测试在开始之前必须等待第一个测试完成,还是同时运行测试?第一个场景很糟糕,因为第二个开发人员必须等待两倍的时间。第二种情况很糟糕,因为这两种测试都可能失败

我认为一个更好的选择是在签入完成后运行单元测试,如果失败,让它将此消息传递给其他人。您可以在每次签入后运行测试,但这仍然有可能让两个人同时签入。我认为最好每N分钟运行一次测试。这样你就能很快找到它

您可以这样做,以使其阻止签入,但您必须确保它仅在对象(或依赖性)更改时运行,这样不会降低每次提交的速度。您还必须确保测试一次运行不超过一次


至于具体的测试,我认为除了通过多次迭代运行测试以获得更准确的结果之外,您不可能逃脱任何惩罚。我不希望依赖任何少于5秒或10秒的测试(因此50到100次迭代)。

为了避免机器依赖性,您可以首先构建一个“参考对象”,该对象具有已知的可接受的构建时间。然后将构建对象的时间与参考对象的时间进行比较


这可能有助于防止过载服务器上的错误故障,因为参考代码也会更慢。我还运行了几次测试,只需要X%的测试就可以通过。(因为有很多外部事件可以减慢代码的速度,但没有一个会加快代码的速度。)

这些可能应该按比例而不是硬数字来完成。否则,它将严重依赖于测试机器的速度。排斥最后一个进行违规签入的开发人员。可能的解决办法包括:戴顶傻乎乎的帽子,大声唱一首小甜甜布兰妮的歌,或者让他穿着粉色小马t恤走进一家自行车酒吧。在检查性能之前,您应该考虑CasH-HealEngEnter,在行中运行多个测试,并选择最佳结果(因为您可能会遇到随机OS调用、中断等)。但这只是我对讨论的想法。@Mysticial你建议我们如何“按比例”进行讨论?你需要测量旧版本和更改后的时间。然后,当您看到显著的回归时,升起一个标志。但是这需要一些工作,因为你必须记录测量值。即使我可以改变这个特定的构造器或者它的使用方式,这也超出了这个问题的范围。马特,在做这样的测试之前,我会做三件事。我认为你的问题的具体答案是answe的最后一个典范