首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何指定JMH微基准测试在不使用资源文件的情况下运行?

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

Stack Overflow用户
提问于 2014-05-11 00:33:36
回答 2查看 5.8K关注 0票数 8

jmh 0.6。我有jmh-core,jmh-生成器-annprocess,jmh-生成器-反射作为依赖项。

首先,不幸的是,文档很差。首先,我使用gradle,而不是maven,所以使用maven原型是不可取的。

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

我非常简单的代码是:

代码语言:javascript
复制
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,类名:

代码语言:javascript
复制
com.github.parboiled1.grappa.TestBenchmark

但它也不起作用:

代码语言:javascript
复制
Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: com.github.parboiled1.grappa.TestBenchmark

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

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

我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2014-05-11 03:39:46

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

注:在JMH中,META-INF/MicroBenchmark是一个内部API,它可能会在不通知的情况下发生变化。你不能使用它就不足为奇了。

票数 8
EN

Stack Overflow用户

发布于 2014-05-22 03:09:43

我使用的是Maven,所以这是一个Maven解决方案,但是如果你遵循下面的步骤,我相信你可以让它适应Gradle。我必须承认,JMH的伟大之处被缺乏文档所掩盖。

一开始我不能让它正常运行,所以最后我创建了一个JUnit测试用例来启动基准测试。对于我来说没有main,因为它对Jenkins来说更容易,而且我也没有创建jar项目。

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

这个配置文件告诉maven将*Benchmark.java添加到surefire执行中。

代码语言:javascript
复制
<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>

当我使用profile基准测试运行Maven时。然后执行基准测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23583625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档