如何摆脱"方法参数应该是@State类"在JMH中,当参数来自另一种方法时?

时间:2017-04-06 09:37:06

标签: java microbenchmark jmh

我正在开展一个maven项目。场景如下所示......

class Test {

    public void applyAll() {
        ....................
        ....................
        Collection<Migratable> applicableUpdates = SomeOtherClass.getApplicableUpdates();
        doUpdate(applicableUpdates);

    }

    @Benchmark
    public void apply(Migratable m) {
        ....................
        ....................
    }

    private void doUpdate(Collection<Migratable> applicableUpdates) throws Exception {
        for (Migratable m : applicableUpdates) {
            try {

                apply(m);

            } catch (Exception e) {
                logger.error("Falid to apply migration {}" + m, e);
                throw e;
            }
        }
    }
}

我需要计算执行每次迁移所需的时间。我只需要计算 apply(Migratable m)方法的执行时间。
现在,当我使用&#34; mvn clean install&#34;构建我的项目时,构建失败并显示&#34;方法参数应为@State classes&#34;。

这里,参数来自另一种方法 doUpdate(Collection applicableUpdates) [见场景]。那么如何在给定的场景中摆脱这个错误呢?

1 个答案:

答案 0 :(得分:2)

你的设置中存在很多问题,看起来你还没有真正看过JMH的样本;我强烈建议你这样做。

一些笔记......

1)你@Benchmark方法返回void - 它应该返回something;否则使用BlackHoles(这在样本中)。

2)如果参数来自另一种方法,则意味着该方法应该是@SetUp方法(这在样本中)

3)您看到的错误与Migratable实际上不是@State类的事实有关(这在样本中也是如此!)

此时我无法强调这一点 - 但看看并了解样本。这不是一件容易的事,这是微基准测试,尽管JMH试图通过隐藏所有非常复杂的代码来让事情变得更容易,但它仍然要求我们遵守那里存在的规则。