如何指定JMH微基准测试以在不使用资源文件的情况下运行?

时间:2014-05-10 16:33:36

标签: java jmh

jhh 0.6。我有jmh-core,jmh-generator-annprocess,jmh-generator-reflection作为依赖项。

首先,不幸的是,文档很差。首先,我使用gradle而不是maven,因此使用maven原型不是一种选择。

其次,我想使用Java API,而不是命令行。

我非常简单的代码是:

public final class TestBenchmark
{
    private static final int COUNT = 100_000;
    private static final List<Integer> LIST = new ArrayList<>();

    static {
        for (int i = 0; i < COUNT; i++)
            LIST.add(i);
    }

    @GenerateMicroBenchmark
    public void foreachLoop()
    {
        int dummy;
        for (final int i: LIST)
            dummy = i;
    }

    @GenerateMicroBenchmark
    public void forLoop()
    {
        int dummy;
        final int size = LIST.size();
        for (int i = 0; i < size; i++)
            dummy = LIST.get(i);
    }

    public static void main(final String... args)
        throws RunnerException
    {
        final Options options = new OptionsBuilder()
            .forks(1)
            .warmupIterations(1)
            .measurementIterations(20)
            .verbosity(VerboseMode.EXTRA)
            .build();

        new Runner(options).run();
    }
}

因为我没有.include(),所以它意味着.*作为正则表达式所有基准。这是我项目中唯一的课程。

但不是:“没有找到基准”。

所以,作为最后的手段,我尝试并按照其他地方的建议创建了META-INF/MicroBenchmarks文件; content,班级名称:

com.github.parboiled1.grappa.TestBenchmark

但它也不起作用:

Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: com.github.parboiled1.grappa.TestBenchmark

当然,这个文件的格式没有记录。

但我不想用这个文件开头;我想指定要运行的类列表。

我该怎么做?

2 个答案:

答案 0 :(得分:6)

您的问题不是基准测试不匹配,而是构建错误配置阻止JMH为您生成和编译合成基准测试代码。您必须让注释处理器运行,并让构建的其余部分将生成的源和资源打包到完整的包中,即使您之后要使用API​​也是如此。由Maven原型制作的项目就是这样做的。还有Ant sample确实指定了其他构建系统应该发生的事情。如果您想使用Gradle,try this

P.S。在JMH中,META-INF / MicroBenchmarks是一个内部API,它可能会更改,恕不另行通知。没有惊喜你无法使用它。

答案 1 :(得分:2)

我正在使用Maven,因此这是一个 Maven 解决方案,但我确信如果您按照这些步骤操作,可以将其调整为Gradle。我不得不承认JMH的伟大之处因缺乏文件而黯然失色。

我最初无法正常运行,所以最后我创建了一个启动基准测试的JUnit测试用例。对我来说不是主要的,因为Jenkins更容易,我没有创建jar项目。

  1. 您已通过代码或构建脚本执行APT处理器。在Maven,它正在运作out of the box
  2. 如果生成了JMH源代码,您可以验证是否成功。
  3. 现在需要编译JMH源代码。 Maven正在开箱即用。不确定Gradle。
  4. 验证您的类文件是否存在。
  5. 现在您可以执行main方法。
  6. 此配置文件告诉maven将* Benchmark.java添加到surefire执行中。

    <profile>
      <id>benchmark</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <includes>
                <include>**/*Benchmark.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    

    当我使用个人资料基准测试运行Maven时。然后执行基准测试。