8

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按照其他地方的建议创建文件;内容,类名:

com.github.parboiled1.grappa.TestBenchmark

但它也不起作用:

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

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

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

我怎么做?

4

2 回答 2

8

您的问题不在于基准测试不匹配,而是构建错误配置阻止了 JMH 为您生成和编译合成基准代码。您必须让注释处理器运行,并让构建的其余部分将生成的源和资源打包到完整的包中,即使您之后要使用 API。Maven archetype 生成的项目就是这样做的。还有一个Ant 示例,它确实指定了其他构建系统应该发生什么。如果你想用 Gradle 做到这一点,试试这个

PS 在 JMH 中,META-INF/MicroBenchmarks 是一个内部 API,如有更改,恕不另行通知。毫不奇怪,您无法使用它。

于 2014-05-10T19:39:46.177 回答
2

我正在使用 Maven,所以这是一个Maven解决方案,但我相信如果您按照步骤操作,您可以将其调整到 Gradle。我不得不承认,JMH 的伟大被缺乏文档所掩盖。

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

  1. 您已经通过代码或构建脚本执行了 APT 处理器。在 Maven 中,它是开箱即用的
  2. 如果生成了 JMH 源代码,则可以验证成功。
  3. 现在需要编译 JMH 源代码。Maven 开箱即用。不确定Gradle。
  4. 验证您的类文件是否存在。
  5. 现在您可以执行 main 方法。

该配置文件告诉 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 时。然后执行基准测试。

于 2014-05-21T19:09:43.310 回答