当前位置: 首页 > 知识库问答 >
问题:

JMH在日食中不起作用(作为Maven项目) - 没有基准测试可以运行

逑兴安
2023-03-14

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

下载了一些官方的JMH示例。作为例子,我选择了非常简单,是一个很好的起点:http://hg.openjdk.java.net/code-tools/jmh/file/0c58dc4fcf17/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_01_HelloWorld.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类文件,对吗?

    有人能帮我找出错误吗?谢谢你。

  • 共有3个答案

    侯沈义
    2023-03-14

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

    越望
    2023-03-14

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

    尝试从终端进行mvn全新安装,而不是在日食中嵌入专家,得到以下错误

    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)
    

    如上所述,添加-Djmh.ignoreLock=true作为eclipseJava应用程序启动器中的VM参数,它起作用了

    史弘博
    2023-03-14

    基准测试“源代码”除了像往常一样编译外,还需要由JMH注释处理器进行处理。在JMH 0.5之前,注释处理器是JMH主工件的一部分,因此对jmh内核的单一依赖就足够了。在 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
    
     类似资料:
    • javapapers.com上的这篇文章展示了如何通过键入在Maven中运行JMH基准测试。在Maven中运行JMH非常方便,因为您可以从Eclipse Run配置甚至在Maven阶段轻松运行它。 然而,这种设置有两个问题: > < li> 当您杀死Maven时,JMH将继续在后台运行,因为< code>exec:exec在一个单独的虚拟机中启动它。 通常,JMH 将启动另一个 VM 来运行基准测

    • 我正在调试一个我自己编写的程序。程序编译和运行没有错误。 使用调试器gcc4.9.3 (rtools_34)时,我得到一条消息: '没有可用的“标准:::o流::运算符”的来源 当跨过任何包含d::c的线时 代码包括:iostream、ostream和string。 此代码也已与其他编译器一起调试,没有出现此问题。它是新编译器对Eclipse的新导入,因此我假设我设置错了。 问题似乎与std::e

    • 我正在使用JMH,一个OpenJDK微基准测试工具。构建过程创建<代码>微基准。我用调用并传递jar名称和JMH参数的jar。 我想知道我们应该使用选项运行基准测试吗?为什么? 换句话说,我是否应该使用以下命令运行基准测试:

    • 注意到Karma测试没有在新的angular-cli项目上运行

    • 我有几个用@Benchmark注释的大型基准类。在使用基准构建jar后,我可以使用以下命令运行所有这些类 如果我不想运行所有基准测试,如何指定要运行的基准测试?

    • 问题内容: 我想通过在Eclipse中将其作为Java应用程序运行来尝试JMH的新功能。我导入并构建了jmh-samples项目。编译的类以/ jmh-samples / target / generated-sources / annotation结尾,/ target /中有多个JAR,并且像往常一样从命令行运行microbenchmarks.jar。 但是,当我执行main时,我总是得到 有