我已将JMH整合到我的maven项目中。我可以成功地对doUpdate(Collection<Migratable> applicableUpdates)
方法进行基准测试
@State(Scope.Thread)
public static class BenchmarkContext {
MigrationManager manager = new MigrationManager();
MigrationRegistry registry = new MigrationRegistry();
Collection<Migratable> applicableUpdates;
@Setup
public void initClient() {
applicableUpdates = registry.getApplicableUpdates(0);
}
}
@Benchmark
@Fork(1)
@Warmup(iterations = 1)
@Measurement(iterations = 5)
public void benchmarkDoUpdate(BenchmarkContext context) throws Exception {
context.manager.doUpdate(context.applicableUpdates);
}
现在,doUpdate(Collection<Migratable> applicableUpdates)
方法在适用的更新中为每个列表元素(可迁移的)for循环调用另一个方法applyUpdate(Migratable migratable)
。
public void doUpdate(Collection<Migratable> applicableUpdates) throws Exception {
for (Migratable migratable : applicableUpdates) {
try {
applyUpdate(migratable);
} catch (Exception e) {
logger.error("Failed to apply migration {}" + migratable, e);
throw e;
}
}
}
我想对applyUpdate(Migratable migratable)
进行基准测试。我怎样才能做到这一点?
我不明白如何设置其参数,因为它来自另一种方法doUpdate(Collection<Migratable> applicableUpdates)
的列表。
或者有没有办法对doUpdate(Collection<Migratable> applicableUpdates)
中的for循环的每次迭代进行基准测试?
答案 0 :(得分:0)
或者有没有办法对for循环的每次迭代进行基准测试
您可以使用@OperationsPerInvocation(<integer>)
告诉JMH您在@Benchmark
方法中执行了多少循环。缺点是它是一个注释 - &gt;因此,参数只能在开发时间&#34;
我想对applyUpdate(Migratable migratable)进行基准测试。我怎样才能做到这一点?
只需在applyUpdate(Migratable migratable)
方法中调用@Benchamrk
,而不是doUpdate
。
IMO将applyUpdate()
与迁移表列表进行对比是没有意义的,因为在结果中结果将是所有迁移的平均时间,但是sme可能需要花费很多时间,而其他可能几乎完成瞬间。因此,这样的基准将毫无用处。
答案 1 :(得分:0)
您可能想要测试每个单独的Migratable 对applyUpdate
花费的时间。如果没有那么多,为每个人提供@Benchmark
怎么样?至少在这种情况下,你会得到一个结果,你可以带回家&#34 ;;意思是你可以看到不是如何更新整个列表;但每次都是......