Java中的自动运行时性能回归测试

时间:2012-01-19 22:47:36

标签: java performance regression-testing caliper

我正在寻找以自动方式检测代码运行时性能变化的方法。这将以与JUnit类似的方式起作用,但不是测试代码的功能,而是测试速度的突然变化。据我所知,现在没有工具可以自动执行此操作。

所以第一个问题是:有没有可用的工具可以做到这一点?

然后第二个问题是:如果没有可用的工具我需要自己动手,需要解决的问题是什么?

如果第二个问题是相关的,那么以下是我看到的问题:

  1. 根据运行环境的不同而变化。
  2. 如果检测到更改,因为Java中的微基准测试存在很大的差异。
  3. 如果Caliper收集结果,如何从卡尺中获取结果,以便可以以自定义格式保存。 Calibre的文档很缺乏。

3 个答案:

答案 0 :(得分:4)

我刚刚遇到http://scalameter.github.io/看起来合适,适用于scala和java。

答案 1 :(得分:2)

看看Caliper CI,我昨天推出了2.0版的Jenkins插件。

答案 2 :(得分:0)

我不知道有任何单独的工具来处理这个问题,但是JUnit在@Test - 注释中有一个名为 timeout 的可选参数:

  

第二个可选参数timeout会导致测试失败   花费的时间超过指定的时钟时间(以   毫秒)。以下测试失败:

@Test(timeout=100) public void infinity() {
   while(true);
}

因此,您可以编写额外的单元测试来检查某些部件是否“足够快”。当然,您需要首先确定特定任务应运行的最长时间。

-

  

如果第二个问题是相关的,那么这就是我的问题   见:

     
      
  1. 根据运行环境的不同而变化。
  2.   

总会有一些变化,但为了尽量减少它,我会使用Hudson或类似的自动化建筑物。测试服务器运行测试,因此每次环境都是相同的(当然,如果运行Hudson的服务器也执行所有其他类型的任务,这些其他任务仍然可能影响结果)。在决定测试的最大运行时间时,你需要考虑到这一点(留下一些“头部空间”,所以如果测试需要比通常多运行5%,它仍然不会立即失败)

  
      
  1. 如果检测到更改,因为Java中的微基准测试存在很大的差异。
  2.   

Java中的微型计算机很少可靠,我会说使用集成测试测试更大的块(例如处理单个http请求或者你曾经拥有的)并测量总时间。如果由于花费太多时间而导致测试失败,请通过分析来隔离有问题的代码,或者在测试运行期间测量并注销测试的各个部分的运行时间,以查看哪个部分花费最多的时间。

  
      
  1. 如果Caliper收集结果,如何从卡尺中获取结果,以便可以以自定义格式保存。口径的   文档缺乏。
  2.   

不幸的是,我对Caliper一无所知。