我正在寻找以自动方式检测代码运行时性能变化的方法。这将以与JUnit类似的方式起作用,但不是测试代码的功能,而是测试速度的突然变化。据我所知,现在没有工具可以自动执行此操作。
所以第一个问题是:有没有可用的工具可以做到这一点?
然后第二个问题是:如果没有可用的工具我需要自己动手,需要解决的问题是什么?
如果第二个问题是相关的,那么以下是我看到的问题:
答案 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);
}
因此,您可以编写额外的单元测试来检查某些部件是否“足够快”。当然,您需要首先确定特定任务应运行的最长时间。
-
如果第二个问题是相关的,那么这就是我的问题 见:
- 根据运行环境的不同而变化。
醇>
总会有一些变化,但为了尽量减少它,我会使用Hudson或类似的自动化建筑物。测试服务器运行测试,因此每次环境都是相同的(当然,如果运行Hudson的服务器也执行所有其他类型的任务,这些其他任务仍然可能影响结果)。在决定测试的最大运行时间时,你需要考虑到这一点(留下一些“头部空间”,所以如果测试需要比通常多运行5%,它仍然不会立即失败)
- 如果检测到更改,因为Java中的微基准测试存在很大的差异。
醇>
Java中的微型计算机很少可靠,我会说使用集成测试测试更大的块(例如处理单个http请求或者你曾经拥有的)并测量总时间。如果由于花费太多时间而导致测试失败,请通过分析来隔离有问题的代码,或者在测试运行期间测量并注销测试的各个部分的运行时间,以查看哪个部分花费最多的时间。
- 如果Caliper收集结果,如何从卡尺中获取结果,以便可以以自定义格式保存。口径的 文档缺乏。
醇>
不幸的是,我对Caliper一无所知。