25

我想将JMH(一个 OpenJDK 微基准测试工具)与gradle一起使用。但是,我在编译时得到了 NPE。另一方面,JMH 在从 Maven 中使用时可以工作。

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

我已经尝试过这里写的内容,但没有成功。

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

例外:

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

5 回答 5

23

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

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

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

下面分步分解。

定义一个新的sourceSet被调用jmh的类路径,该类路径与主路径挂钩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'
}

定义任务jmh类型JavaExec

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

挂钩jmhClasses任务以classes确保基准与其余代码一起编译后运行

classes.finalizedBy(jmhClasses)
于 2018-12-21T18:41:38.837 回答
22

目前你可以只使用专用插件jmh-gradle-plugin

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

于 2014-07-16T23:26:26.317 回答
10

我的错,我试图对一个有参数的方法进行基准测试——当然,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。

于 2013-12-07T17:54:46.677 回答
5

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

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

于 2021-01-05T13:51:30.197 回答
0

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

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

  • 添加依赖项
  • 创建你的基准
  • 要开心 :)
于 2019-08-16T15:21:02.103 回答