当参数来自其他方法时,如何摆脱JMH中的“方法参数应为@State类”?

nee*_*tno 5 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要计算执行每次迁移需要多长时间。我只需要计算apply(Migratable m)方法的执行时间。
现在,当我使用“ mvn clean install”构建项目时,构建失败,并且显示“方法参数应为@State类”。

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

Eug*_*ene 6

您的设置存在很多问题,而且您似乎还没有真正查看过 JMH 的示例;我强烈建议你这样做。

一些注意事项...

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

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

Migratable3)您看到的错误与您实际上不是一个类这一事实有关@State(这又出现在示例中!)

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