2010-12-22 50 views
8

我正在用C#/ .NET开发软件,但我想这个问题也可以被要求用于其他编程语言。你如何测试你的软件在不同版本之间的性能?让我再详述一下。如何测试软件发行版本之间的代码性能?

在软件的产品发布之前,我想比较软件的性能,以获得软件以前版本中可用的一组功能。假设您正在讨论导致发布一个或多个dll的软件库项目(无GUI)。如何实现这一目标?什么是一些最佳实践?我不可能将当前的dll与以前的发行版dll交换并运行相同的测试。

我能想到的一种方式是在主分支(用于当前版本)和较早的发行版分支中添加相同的性能测试,然后比较性能。我认为这样做有一些痛苦,但是可能的。

我能想到的另一种方法是从最小版本分支开始,将最新版本之后放入的新代码和功能进行分类,然后运行测试。我不认为这会产生正确的结果,更不用说这种方法比以前的方法更加痛苦。

感谢您的其他想法。首选C#/ .NET特定的答案。

编辑1:Thisthis是有些相关的问题。

+0

这将成为一个很好的维基条目。 – 2010-12-22 23:24:49

+0

我很好,但不知道如何做到这一点。我想我可能没有足够的分数等等。主持人可以使这个wiki成为我想的。 – 2010-12-23 15:28:23

回答

3

我们有一套性能测试。这些只是NUnit测试。每个测试都会设置一些对象,启动计时器(Stopwatch工作正常),我们感兴趣的操作(例如,加载某个屏幕的数据),然后将已用时间写入CSV文件。 (NUnit记录每个测试需要多长时间,但我们希望排除设置逻辑,在某些情况下,这些逻辑在测试之间会有所不同 - 所以执行我们自己的计时器和日志记录会更有意义。)

我们经常在相同的硬件和网络环境中运行这些测试。我们将结果导入数据库。然后,很容易构建显示趋势的图表,或者调出大的百分比变化。

1

您可以将测试结果附加到每个新版本的源受控文本文件。这将为您提供每个版本性能的易于访问的历史记录。

您对分支和中继运行性能测试的想法基本相同,但保存结果可能会节省您来回切换工作副本的工作量。

2

如果要实际比较发布版本之间的性能,那么您需要一些测试来执行跨版本的相同功能。单元测试通常适用于此。

你可以做的另一个更积极的事情是根据预定义的性能阈值对代码进行日志记录。例如,当您在旧版本中运行代码时,您会得到一个指标。然后将时间代码添加到您的应用程序中,以便如果同一个函数在任何时间点需要更长的时间,请记录一条消息(或广播一个调用者可以选择记录的事件)。当然,您不想过度使用时序代码本身会导致性能下降的程度。

我们在使用SQL调用的应用程序中执行此操作。对于任何单个SQL调用需要的最长时间,我们都有一个阈值,并且如果有超过阈值的SQL调用,那么我们将其作为警告记录下来。我们还跟踪给定http请求中的SQL调用数量。你的目标应该是随着时间的推移减少阈值。

您可以将这些测试包装在#if部分中,以使其不包含在生产中,但在生产中也可能非常有用。

0

我们有一个用户(或测试者)可以启用的特殊设置。我们启用它,它会生成一个CSV文件,我们可以将它提供给Excel并查看性能报告。

它会报告某些操作的个人计数和他们花了多长时间。 Excel以一种很好的视觉方式为我们展示了这一点。

所有的代码都是自定义的,唯一的缺点是性能跟踪代码的开销,但是我们对它进行了基准测试,它几乎没有。这是一个非常优化和非常短的。

这种方法的美妙之处在于,如果您遇到无法重现的性能问题,您可以从客户那里获得良好的反馈。