JMH不在Eclipse中工作(作为Maven项目) - 没有运行的基准测试

pit*_*chr 7 java eclipse microbenchmark maven jmh

我想开始看一下JMH,由于某些原因我无法运行基准测试.让我解释一下我的尝试:

  1. 在Eclipse中设置maven项目
  2. 定义pom.xml如: 在此输入图像描述

  3. 下载了一些官方的JMH示例.作为示例,我选择哪个非常简单并且是一个好的起点:http: //hg.openjdk.java.net/code-tools/jmh/file/0c58dc4fcf17/jmh-samples/src/main/java/org/openjdk /jmh/samples/JMHSample_01_HelloWorld.java

  4. 用鼠标右键单击>运行方式> Java应用程序

但是这会产生输出:

Exception in thread "main" No benchmarks to run; check the include/exclude regexps.
at org.openjdk.jmh.runner.Runner.run(Runner.java:155)
at org.openjdk.jmh.samples.JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:90)
Run Code Online (Sandbox Code Playgroud)

我用google搜索,似乎上面的例子应该可行,但对我来说情况并非如此.我也尝试通过阅读来解决这个问题,但这对我来说似乎不起作用:

  • 从日食中的主要运行JMH时"没有匹配的基准"
  • 我试图将生成的类手动移动到/ META-INF/MicroBenchmarks但是这会产生以下错误:

    Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: JMHSample_01_HelloWorld.class
    at org.openjdk.jmh.runner.BenchmarkRecord.<init>(BenchmarkRecord.java:92)
    at org.openjdk.jmh.runner.MicroBenchmarkList.find(MicroBenchmarkList.java:133)
    at org.openjdk.jmh.runner.Runner.run(Runner.java:150)
    at JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:80)
    
    Run Code Online (Sandbox Code Playgroud)

似乎JMH应该在/ META-INF/MicroBenchmarks中产生一些有效的行 - 意味着在这个文件夹中不应该生成java类文件,对吗?

任何人都可以帮我找到错误吗?谢谢.

Ole*_*hin 14

除了像往常一样编译之外,基准"源代码"还需要由JMH注释处理器处理.在JMH 0.5之前,注释处理器是主JMH工件的一部分,因此单个依赖jmh-core就足够了.在JMH 0.5中,注释处理功能被提取到单独的工件中以便于支持其他语言.

为了使注释处理器回到"旧的"基于Java的JMH项目中,应该声明对处理器工件的附加依赖:

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>${jmh.version}</version>
    <!-- 
    the processor artifact is required only during compilation and 
    does not need to be transitive, hence provided scope
    -->
    <scope>provided</scope> 
</dependency>
Run Code Online (Sandbox Code Playgroud)

对于新的JMH项目,最简单的方法是使用适当的语言特定原型(除Java之外,还有Scala,Groovy和Kotlin 原型)生成新项目,如JMH主页中所述.

mvn archetype:generate \
      -DinteractiveMode=false \
      -DarchetypeGroupId=org.openjdk.jmh \
      -DarchetypeArtifactId=jmh-java-benchmark-archetype \
      -DgroupId=my.benchmark.group \
      -DartifactId=MyBenchMarkArtifact \
      -Dversion=1.0
Run Code Online (Sandbox Code Playgroud)