我已经将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循环中为applyableUpdates中的每个列表元素(Migratable)调用另一个方法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循环的每次迭代进行基准测试? 最佳答案
还是有一种方法可以对for循环的每次迭代进行基准测试
您可以使用@OperationsPerInvocation(<integer>)
告诉JMH您正在@Benchmark
方法中执行了多少个循环。缺点是它是一个注释->因此该参数只能在“开发时间”内更改
我想对applyUpdate(Migratable migratable)进行基准测试。我怎样才能做到这一点?
只需在applyUpdate(Migratable migratable)
方法而不是@Benchamrk
内调用doUpdate
。
IMO用一个可迁移表列出基准applyUpdate()
是没有意义的,因为最终结果将是所有可迁移表的平均时间,但是sme可能会花费很多时间,而其他可能几乎是立即完成的。因此,这样的基准将毫无用处。