如何选择jmh配置参数

时间:2017-05-03 14:54:25

标签: java jmh

我想用jmh编写性能测试来测量我的应用程序代码的某些部分。我已经阅读了jmh samples关于如何编写测试的信息,并在youtube上观看了有关jmh和性能测试的一些讨论。

我不明白如何为@Warmup@Measurement@Fork值选择正确的值。在大多数样本中,它是1个Fork,10次迭代,持续时间为1秒。

我明白,配置没有灵丹妙药,但在选择我应该放置的价值时,我的思考过程应该是什么?

2 个答案:

答案 0 :(得分:2)

我不知道是否有人可以推荐实际上尽可能接近的参数 - 甚至可能不是那些编写该工具的人。这非常特定于您正在测试的用例,操作系统,JVM等。

我个人使用不同的参数做了几次并每次捕获结果以便我可以分析它。您有一些错误+/- (至少平均时间)字段是我的第一个指示。如果它太大(这是你要确定的),我通常会增加@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)

我可能会一点一点地增加iterationstime,看看我是否接近以前的运行结果。

我通常在相同的热身时运行所有基准测试,因此结果不会偏向于此。

要到达这里的是,你可能得到好的或坏的结果,或者速度慢和快 - 但这只是输出,不是的原因。了解原因并在jmhperfasm以及许多其他个人资料工作站下运行xperfasm,这是一个完全不同的厨房,远离我的联盟......

答案 1 :(得分:0)

@Eugene的回答只需要一点补充。

@Fork用于检查热代码的优化。有时,您可能会在不同的分叉中看到非常不同的结果。这是因为JIT编译器会根据使用情况将一些代码与更优化的代码交换。所以我亲自至少跑了3个叉子。