我想使用jmh编写性能测试来度量应用程序代码的某些部分。我读过jmh样品关于如何编写测试的文章,并在youtube上观看了一些关于jmh和性能测试的讲座。
我不明白的是如何为@Warmup、@Measurement和@Fork值选择正确的值。在大多数示例中,它是1叉,10次迭代,持续1秒。
我明白,配置没有灵丹妙药,但是在选择应该放置哪些值时,我的思维过程应该是什么呢?
发布于 2017-05-04 10:33:02
我不知道是否有人能推荐你可能需要的最接近的参数--甚至是那些编写这个工具的人。这对于您正在测试的用例、OS、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)我可能会一点一点地增加iterations和time,看看以前的运行是否接近恒定的结果。
我通常在相同的热身下运行所有的基准,这样结果就不会有偏见。
这里要做的是,你可能会得到好的或坏的结果,或者慢而快--但这只是输出,而不是原因。理解原因,在perfasm或xperfasm下运行perfasm或xperfasm以及许多其他的分析器,是一个完全不同的厨房,超出了我的范围.
发布于 2018-06-21 05:36:00
只是对尤金的回答作了一点补充。
@Fork用于检查热代码的优化。有时你可能会在不同的叉子上看到非常不同的结果。这是因为JIT编译器根据使用情况将一些代码转换为更优化的代码。所以我个人至少开了三个叉子。
https://stackoverflow.com/questions/43763530
复制相似问题