如何对for循环的每次迭代进行基准测试(使用JMH)?

时间:2017-04-30 10:09:59

标签: java maven microbenchmark jmh

我已将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循环的每次迭代进行基准测试?

2 个答案:

答案 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 ;;意思是你可以看到不是如何更新整个列表;但每次都是......