如何选择JMH配置参数

4
我想使用jmh编写性能测试,以测量应用程序中的某些代码部分。我阅读了有关如何编写测试的jmh示例并观看了一些关于jmh和性能测试的YouTube视频。
我不明白的是如何选择@Warmup@Measurement@Fork值。在大多数示例中,它为1个Fork,10个迭代,持续时间为1秒。
我知道配置没有万能解决方案,但在选择要放置的值时,我的思考过程应该是什么?
2个回答

3

我不确定是否有人能够推荐实际上需要的参数,可能甚至是编写该工具的人也不行。这取决于你测试的用例、操作系统、JVM等极为具体的情况。

个人而言,我会使用不同的参数进行多次测试,并记录每次结果以便分析。你可以看一下 Error +/-(至少是平均时间)字段,这是我第一个参考指标。如果误差过大(由你来判断),我通常会增加 @Warmup@Measurement;这不是绝对规则,但这是我的做法。以下是我使用的示例:

 @BenchmarkMode(Mode.AverageTime)
 @OutputTimeUnit(TimeUnit.NANOSECONDS)
 @Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
 @Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
 @State(Scope.Thread)

我可能会逐渐增加迭代次数和时间,以查看是否能接近之前的运行结果。
我通常在相同的预热下运行所有基准测试,以避免结果受此影响。
需要理解的是,你可能会得到好或坏的结果,快或慢 - 但这只是输出,而不是原因。理解原因并在perfasm、xperfasm和许多其他分析器下运行jmh是完全不同的事情,这超出了我的能力范围...

我不完全理解你的意思,“我通常在同一个预热下运行所有基准测试”。你是指在类级别而不是方法级别上运行所有基准测试吗? - Ray
@Ray 没错,在类级别上定义,而不是在每个方法上定义。 - Eugene

0

对@Eugene的回答进行了一点补充。

@Fork用于检查热代码的优化。有时您可能会在不同的forks中看到非常不同的结果。这是因为JIT编译器根据使用情况将某些代码与更优化的代码交换。所以我个人至少运行3个forks。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接