Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 执行TDD时的性能测试最佳实践?_Performance_Tdd_Automated Tests_Integration Testing - Fatal编程技术网

Performance 执行TDD时的性能测试最佳实践?

Performance 执行TDD时的性能测试最佳实践?,performance,tdd,automated-tests,integration-testing,Performance,Tdd,Automated Tests,Integration Testing,我正在做一个项目,它非常需要一些性能调整 如果我的优化没有提高程序的速度,如何编写失败的测试 详细说明一下: 问题不在于发现要优化的部件。为此,我可以使用各种分析和基准测试工具 问题在于使用自动化测试来证明特定优化确实达到了预期效果。如果我可以使用测试套件来发现以后可能出现的性能退化,这也是非常可取的 我想我可以运行我的分析工具来获得一些值,然后断言我的优化代码会产生更好的值。然而,这一点的明显问题是,基准值并不是硬值。它们因当地环境而异 那么,总是使用同一台机器进行这种集成测试的答案是什么呢?

我正在做一个项目,它非常需要一些性能调整

如果我的优化没有提高程序的速度,如何编写失败的测试

详细说明一下:

问题不在于发现要优化的部件。为此,我可以使用各种分析和基准测试工具

问题在于使用自动化测试来证明特定优化确实达到了预期效果。如果我可以使用测试套件来发现以后可能出现的性能退化,这也是非常可取的

我想我可以运行我的分析工具来获得一些值,然后断言我的优化代码会产生更好的值。然而,这一点的明显问题是,基准值并不是硬值。它们因当地环境而异

那么,总是使用同一台机器进行这种集成测试的答案是什么呢?如果是这样,您仍然需要考虑结果中的一些模糊性,因为即使在相同的硬件上,基准测试结果也可能会有所不同。那么如何考虑这一点呢


或者答案可能是保留旧版本的程序,并比较前后的结果?这将是我的首选方法,因为它主要与环境无关。有人有过这种方法的经验吗?我想,如果所有测试都能通过,并且最新版本的性能至少与前一版本一样好,那么只需要保留一个旧版本。

首先,您需要为可接受的性能建立一些标准,然后您需要设计一个在使用现有代码时不符合该标准的测试,然后,您需要调整代码的性能,直到它通过测试。您可能会有多个性能标准,当然您应该有多个测试。

记录当前代码的运行时间

if (newCode.RunningTime >= oldCode.RunningTime) Fail

在许多服务器应用程序(可能不是您的情况)中,性能问题仅在并发访问和负载下出现。因此,测量例程执行的绝对时间并试图改进它并没有多大帮助。即使在单线程应用程序中,这种方法也存在问题。测量绝对例行时间依赖于平台提供的时钟,这些是:;你最好依靠一个常规动作的平均时间

我的建议是:

  • 使用分析来识别执行次数最多、花费时间最多的例程
  • 使用诸如或之类的工具来详细说明具有代表性的测试用例,模拟并发访问,将应用程序置于压力之下,并测量(更重要的是)吞吐量和平均响应时间。这将使您更好地了解从外部角度看应用程序的行为

虽然您可以使用单元测试来建立应用程序的一些非功能方面,但我认为上面给出的方法将在优化过程中提供更好的结果。当在单元测试中放置与时间相关的断言时,您必须选择一些非常近似的值:时间可能因运行单元测试所使用的环境而异。您不希望测试失败仅仅因为您的一些同事使用了劣质硬件


调整就是要找到合适的东西进行调整。您已经有了一个正常运行的代码,因此在事后放置与性能相关的断言,而不建立关键的代码部分,可能会导致您在优化应用程序的非关键部分上浪费大量时间。

在CI server中运行测试+评测。您还可以定期运行负载测试

您关心的是差异(正如您所提到的),所以它不是定义一个绝对值。有一个额外的步骤,将此运行的性能度量与上次生成的性能度量进行比较,并将差异报告为%。你可以对重要的时间变化发出警告

如果你关心绩效,你应该有明确的目标,你想达到并坚持这些目标。您应该在整个系统上进行测试。即使您的应用程序逻辑很快,您也可能会遇到视图问题,导致您无法实现目标。您也可以将其与差异方法相结合,但对于这些方法,您对时间变化的容忍度会降低


请注意,您可以在dev计算机上运行相同的进程,只需使用该计算机上以前的运行,而不是开发人员之间的共享运行。

我怀疑将TDD应用于驱动性能是一个错误。无论如何,使用它来获得良好的设计和工作代码,并使用在TDD过程中编写的测试来确保持续的正确性——但一旦您拥有了经过良好考虑的代码和一套可靠的测试,您就可以进行良好的调整,并应用不同的(与TDD不同的)技术和工具


TDD为您提供了良好的设计、可靠的代码和测试覆盖率安全网。这将为您提供一个进行调优的好地方,但我认为,由于您和其他人所提到的问题,这不会让您在调优的道路上走得更远。我说,作为TDD的狂热支持者和实践者。

对于调优本身,您可以直接比较旧代码和新代码。但不要把两份都放在身边。这听起来像是一场噩梦。而且,您只会将一个版本与另一个版本进行比较。功能的改变可能会降低您的功能,这是用户可以接受的


就我个人而言,我从未见过“必须比上一个版本快”这样的性能标准,因为它很难衡量

您会说“严重需要性能调整”。哪里哪些问题?哪些功能?谁说,企业,用户?什么是可接受的性能?3秒?2秒?50毫秒

任何性能分析的起点