0

我有一段性能关键的代码,我想将其作为 maven 构建步骤进行保护,即 JMH 将运行并检查性能是否随着本地更改而降低。

如何使用 JMH 检查这种退化?

我找到了一些相关链接:

我之前已经实现了自动化性能测试(尽管不是使用 Java,也不是在 CI 环境中)。需要注意的一个关键点是,您永远不要将其作为绝对值运行,因为运行基准测试的机器可能会有所不同。BogoMips 或依赖于测试的参考类型可用作相对比较。然后将基准测量为该参考时间的某个倍数,具有上限和下限。

虽然您通常会担心基准测试速度变慢(降级),但检查上限也很重要,因为它可能表示意外的加速(更好的硬件支持),这应该表明每个系统/架构的限制需要检查。

4

3 回答 3

0

看起来有可能,这个netty.io 提交添加了对 JMH 的支持,该 JMH 包含在一个 Junit 测试中。

我从 JMH 选项中注意到:

-rf <type>      Result format type.
                See the list of available result formats first. 
-rff <filename> Write results to given file. 

这意味着我可以告诉 Benchmark 将其结果输出到 JSON 文件,然后我可以将其作为 Junit 运行的一部分进行解析。

最后一部分是将 Run 与 Junit 中的其他东西进行比较,也许是SPECjvm2008

于 2015-03-19T23:44:50.200 回答
0

JMH Maven 插件不支持这个。您必须编写自己的 Maven 插件来执行此操作,或者您必须在构建生命周期中使用 java exec 插件来执行测试。您可以将基准测试结果写入文件并找到另一个 Maven 插件来读取文件并在它不匹配给定约束时中断构建。

但是,我怀疑这是一个好主意。如果您的代码更改显着改变了基准,则很可能您的基准不再适合您的代码。更糟糕的是,即使您的代码变慢了,您的基准测试也可能变得更快,因为基准测试不再反映真实的用例。此外,您必须找到一个基线,因为基准不适合测量“绝对”运行时。

可能存在一些适合这种方法的极端情况,但您应该考虑它是否真的值得麻烦。

于 2015-03-17T08:16:37.700 回答
0

I would suggest to simply build a set of Runner options via the OptionsBuilder and call run on it from within a Junit test. While some authors recommend against this on the grounds of not running the benchmark in a "clean" environment, I think the effects are very marginal and probably irrelevant when comparing against a reference run in the same environment.

See here for the most trivial example of setting up a Runner manually.

Runner.run() ( or in the case of a single benchmark Runner.runSingle()) will then return a Collection<RunResult> or just RunResult, that assertions can be made against.

In order to do so you could simply use the Statistics (see docs here) you can extract from the RunResult via RunResult.getPrimaryResult().getStatistics() and assert against the numeric values you can extract from Statistics

... or use the isDifferent() method that gives you the option to compare two benchmark runs within a confidence interval (might be useful to automatically catch outliers in both directions).

于 2016-03-25T21:09:26.710 回答