【问题标题】:How to use JMH with gradle?如何将 JMH 与 gradle 一起使用?
【发布时间】:2013-12-24 23:46:33
【问题描述】:

我想使用带有 gradle 的 OpenJDK 微基准工具 JMH。但是,我在编译时得到了 NPE。另一方面,JMH 在从 maven 中使用时可以工作。

我没有发布任何build.gradle,因为它是基本的 - 应用 java 插件并添加对 JHM 工具的依赖 (org.openjdk.jmh:jmh-core:0.2)。

我尝试了here 写的内容,但没有成功。

我还需要做什么?我想设置代理的东西,但我还是没弄明白。

例外:

:compileJava
java.lang.NullPointerException
at org.openjdk.jmh.processor.internal.GenerateMicroBenchmarkProcessor.validMethodSignature(GenerateMicroBenchmarkProcessor.java:502)

【问题讨论】:

    标签: gradle jmh


    【解决方案1】:

    我的错,我试图对一个有参数的方法进行基准测试 - 当然 JMH 不知道要传递什么 :) 当我创建一个没有参数的 void 方法时,一切正常。

    我的build.gradle

    defaultTasks 'build'
    
    apply plugin: 'java'
    apply plugin: 'shadow'
    
    buildscript {
        repositories {
            mavenCentral()
            maven {
                name 'Shadow'
                url 'http://dl.bintray.com/content/johnrengelman/gradle-plugins'
            }
        }
        dependencies {
            classpath 'org.gradle.plugins:shadow:0.7.4'
        }
    }
    
    jar {
        manifest {
            attributes 'Main-Class': 'org.openjdk.jmh.Main'
        }
    }
    
    repositories {
        mavenCentral()
    }
    
    
    build.doLast {
        tasks.shadow.execute()
    }
    
    shadow {
        outputFile = new File('build/libs/microbenchmarks.jar')
    }
    
    ext {
        lib = [
            ... other dependencies...
            jmh:            'org.openjdk.jmh:jmh-core:0.2'
        ]
    }
    
    dependencies {
        compile lib... other dependencies...
        compile lib.jmh
    }
    
    sourceCompatibility = 1.7
    

    构建测试和 jar:

    gw clean build
    

    然后运行它们:

    java -jar build/libs/microbenchmarks.jar ".*" -wi 2 -i 10 -f 2 -t 16
    

    更新

    从 JMH 的最新版本中,您还需要将依赖项添加到:

    org.openjdk.jmh:jmh-generator-annprocess:0.5.4
    

    你可以使用阴影 0.8。

    【讨论】:

    • 是的,但 JMH 也应该打印出更理智的错误消息。您能否尝试将之前的错误基准提供给 jmh 的 1.0-SNAPSHOT 版本(需要从源代码构建)?我在那里重建了验证代码的重要部分。
    • 是的,NPE 让我很困惑,我以为我做错了什么。当然,我会尝试 1.0-SNAPSHOT,但首先要为其他人准备好所有的在线回购。之后我就可以和本地人一起玩了。
    【解决方案2】:

    目前只能使用专用插件jmh-gradle-plugin

    它需要最少的配置,并允许您运行 JMH 基准测试以及构建基准测试工件

    【讨论】:

    • 不可能运行单独的测试,不可能在每个测试中使用单独的 jvm_args,等等。如果你只是想和 JMH “玩” - 当然,如果你打算认真对待它 - 这是一个大的NOGO。
    • 看起来插件现在可以配置为运行单独的测试,使用单独的 JVM 参数等。参见configuration options
    【解决方案3】:

    刚刚完成我的“masterpiece”。没有 uber-jars,没有插件,代码库与 main 和 test 分离,基准编译与 main 挂钩,但不会在主流生命周期中自动运行。简单、明确且可破解的香草 gradle。

    我直接从 IntelliJ 运行它,要在一个盒子上运行,你可能需要 uber-jar 回来:-)

    在做之前,我花了相当多的时间试图让那个插件工作,但它对我的口味来说太笨重了。

    下面的分步细分。

    定义一个名为jmh 的新sourceSet,其类路径与主sourceSet 的类路径挂钩

    sourceSets {
        jmh {
            java.srcDirs = ['src/jmh/java']
            scala.srcDirs = ['src/jmh/scala']
            resources.srcDirs = ['src/jmh/resources']
            compileClasspath += sourceSets.main.runtimeClasspath
        }
    }
    

    为其定义依赖项(至少为 JMH 及其注释处理器)。

    dependencies {
        ...
        jmhImplementation 'org.openjdk.jmh:jmh-core:1.21'
        jmhImplementation 'org.openjdk.jmh:jmh-generator-annprocess:1.21'
    }
    

    定义JavaExec类型的任务JavaExec

    task jmh(type: JavaExec, dependsOn: jmhClasses) {
        main = 'org.openjdk.jmh.Main'
        classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath
    }
    

    挂钩 jmhClasses 任务以在 classes 之后运行,以确保使用其余代码编译基准测试

    classes.finalizedBy(jmhClasses)
    

    【讨论】:

    • 如此简单。完美的!我遇到的一件事:您需要确保已将 IntelliJ 配置为 use separate module per source set,否则它将找不到您的 JMH 源集。
    • 这,先生,太美了! 1+
    【解决方案4】:

    如果您是 IntelliJ 用户,那么在没有所有变通方法的情况下,最简单的方法可能是使用 IDE 插件:

    https://github.com/artyushov/idea-jmh-plugin

    • 添加依赖项
    • 创建您的基准
    • 要开心:)

    【讨论】:

      【解决方案5】:

      我做了一个非常小的示例项目来克隆和修改你喜欢的。这是一个完整的工作示例:
      https://gitlab.com/barfuin/jmh-gradle-example

      它不需要影子罐子和插件,同时仍然在专用 JVM 中运行基准测试。该项目还包括一些额外的 Gradle 任务,用于打印类路径、JMH 选项等,这些内容可能有助于理解正在发生的事情。

      【讨论】:

        猜你喜欢
        • 2014-05-25
        • 2017-11-09
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多