7

我想开始看看 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)

我用谷歌搜索过,上面的例子似乎应该可以工作,但对我来说不是这样。我也试图通过阅读来解决这个问题,但这似乎对我不起作用:

  • 在 Eclipse 中从 main 运行 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)
    

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

谁能帮我找出错误?谢谢你。

4

4 回答 4

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>

对于新的 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
于 2014-06-02T06:34:55.960 回答
1

尽管拥有所有必需的依赖项和插件,但我在 jmh+maven+eclipse 项目的 eclipse 控制台中遇到了同样的错误。

在eclipse中尝试mvn clean install从终端而不是嵌入式maven,得到以下错误

ERROR: org.openjdk.jmh.runner.RunnerException: ERROR: Unable to acquire the JMH lock (/tmp/jmh.lock): already taken by another JMH instance, exiting. Use -Djmh.ignoreLock=true to forcefully continue.
    at org.openjdk.jmh.runner.Runner.run(Runner.java:202)
    at org.openjdk.jmh.Main.main(Main.java:71)

正如上面推荐的那样,在eclipse Java 应用程序启动器中添加-Djmh.ignoreLock=true为 VM 参数,它可以工作

于 2016-07-13T05:02:49.777 回答
0

我得到了同样的错误,因为我在@Benchmark之前运行它之后更改了包含我的类的包的名称。“清理并构建”足以让它再次工作。

于 2018-06-22T21:04:52.850 回答
0

如果您重构了包含@Benchmark 的类的名称,您可能会遇到此错误,

您还必须更改主函数中的名称。

OptionsBuilder opts = new OptionsBuilder();
opts.include("<new_class_name>");
于 2021-11-12T09:08:58.623 回答