Java 是否可以将JMH用作maven验证检查?
我有一段性能关键的代码,我想作为maven构建步骤加以保护,即JMH将运行并检查性能是否随着本地更改而降低 如何使用JMH检查这种降级 我找到了一些相关链接:Java 是否可以将JMH用作maven验证检查?,java,performance,maven,continuous-integration,jmh,Java,Performance,Maven,Continuous Integration,Jmh,我有一段性能关键的代码,我想作为maven构建步骤加以保护,即JMH将运行并检查性能是否随着本地更改而降低 如何使用JMH检查这种降级 我找到了一些相关链接: (使用@Required()注释) 我以前实现过自动性能测试(虽然不是用Java,也不是在CI环境中)。需要注意的一个关键点是,您永远不会将其作为绝对值运行,因为运行基准的机器可能会有所不同。BogoMips或测试相关参考类型可用作相对比较。然后将基准测量为该参考时间的某个倍数,并带有上限和下限 虽然您通常对基准测试的速度减慢(
- (使用
注释)@Required()
虽然您通常对基准测试的速度减慢(降级)持谨慎态度,但检查上限也很重要,因为它可能表示意外的加速(更好的硬件支持),这应该表明需要检查每个系统/体系结构的速度限制。JMH Maven插件不支持这一点。要做到这一点,您必须编写自己的Maven插件,或者必须在构建生命周期内使用javaexec插件来执行测试。您可以将基准测试结果写入一个文件,并找到另一个Maven插件,该插件读取一个文件,如果该文件与给定的约束不匹配,则中断构建 然而,我怀疑这是一个好主意。如果您的代码更改显著改变了基准测试,那么很可能您的基准测试不再适合您的代码。更糟糕的是,即使您的代码变慢了,您的基准也可能变得更快,因为基准不再反映真实的用例。此外,您必须找到一个基准,因为基准不适合度量“绝对”运行时
可能有一些适合这种方法的拐角情况,但是你应该考虑它是否真的值得麻烦。
看起来是可能的,这个JMH的附加支持包在JUnit测试中。
我从JMH选项中注意到:-rf <type> Result format type.
See the list of available result formats first.
-rff <filename> Write results to given file.
-射频结果格式类型。
首先查看可用结果格式列表。
-rff将结果写入给定文件。
这意味着我可以告诉基准测试将其结果输出到一个JSON文件,然后作为Junit运行的一部分进行解析
最后一部分是将该运行与Junit中的其他运行进行比较,也许?我建议只需通过
OptionsBuilder
构建一组Runner
选项,并在Junit测试中调用Run
。
虽然一些作者以不在“干净”的环境中运行基准为理由反对这种做法,但我认为,与在相同环境中运行参考相比,这种影响非常微小,可能无关紧要
有关手动设置运行程序的最简单示例,请参阅
Runner.run()
(或者在单个基准测试的情况下Runner.runSingle()
)将返回一个集合
,或者只返回一个RunResult
,可以对其进行断言
为此,您可以简单地使用统计数据
(请参阅文档),您可以通过RunResult.getPrimaryResult().getStatistics()
从运行结果
中提取数据,并对从统计数据
中提取的数值进行断言
。。。或者使用isDifferent()
方法,该方法为您提供了在置信区间内比较两个基准测试运行的选项(可能有助于自动捕获两个方向上的异常值)。谢谢,这正是我发现netty示例后编写的内容;基线、绩效变化限制;虽然这确实意味着你需要在詹金斯里面跑步……所有的注意事项都被注意到了。我们在一台专用的纯金属机器上运行测试,所以喜欢与喜欢的比较应该是可靠的。只是希望得到一些通知,有些东西改变了,无论是好是坏,所以我们不得不去看它。而不是等待3个月,然后想知道是哪个提交导致了问题。。。