我已经将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可能会花费很多时间,而其他可能几乎是立即完成的。因此,这样的基准将毫无用处。

09-10 16:31