4

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

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

那么第二个问题是:如果没有可用的工具并且我需要自己推出,那么需要解决哪些问题?

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

  1. 可变性取决于它运行的环境。
  2. 由于 Java 中的微基准测试有很大的差异,如何检测变化。
  3. 如果 Caliper 收集结果,如何将结果从 caliper 中取出,以便以自定义格式保存。缺少 Calibre 的文档。
4

3 回答 3

4

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

于 2012-11-22T10:20:59.787 回答
2

看看 Caliper CI,我昨天发布了 2.0 版作为 Jenkins 插件。

于 2012-01-20T23:06:11.317 回答
0

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

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

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

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

-

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

  1. 可变性取决于它运行的环境。

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

  1. 由于 Java 中的微基准测试有很大的差异,如何检测变化。

Java 中的微基准测试很少可靠,我会说使用集成测试(例如处理单个 http 请求或您拥有的任何东西)测试更大的块并测量总时间。如果测试因耗时过多而失败,可以通过 profiling 隔离有问题的代码,或者在测试运行期间测量并注销测试各个部分的运行时间,以查看哪个部分花费的时间最多。

  1. 如果 Caliper 收集结果,如何将结果从 caliper 中取出,以便以自定义格式保存。缺少 Calibre 的文档。

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

于 2012-01-20T06:24:59.400 回答