Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将JMH用作maven验证检查?_Java_Performance_Maven_Continuous Integration_Jmh - Fatal编程技术网

Java 是否可以将JMH用作maven验证检查?

Java 是否可以将JMH用作maven验证检查?,java,performance,maven,continuous-integration,jmh,Java,Performance,Maven,Continuous Integration,Jmh,我有一段性能关键的代码,我想作为maven构建步骤加以保护,即JMH将运行并检查性能是否随着本地更改而降低 如何使用JMH检查这种降级 我找到了一些相关链接: (使用@Required()注释) 我以前实现过自动性能测试(虽然不是用Java,也不是在CI环境中)。需要注意的一个关键点是,您永远不会将其作为绝对值运行,因为运行基准的机器可能会有所不同。BogoMips或测试相关参考类型可用作相对比较。然后将基准测量为该参考时间的某个倍数,并带有上限和下限 虽然您通常对基准测试的速度减慢(

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

如何使用JMH检查这种降级

我找到了一些相关链接:

  • (使用
    @Required()
    注释)
我以前实现过自动性能测试(虽然不是用Java,也不是在CI环境中)。需要注意的一个关键点是,您永远不会将其作为绝对值运行,因为运行基准的机器可能会有所不同。BogoMips或测试相关参考类型可用作相对比较。然后将基准测量为该参考时间的某个倍数,并带有上限和下限


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

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个月,然后想知道是哪个提交导致了问题。。。