如何在gradle中使用JMH?

时间:2013-12-07 16:59:22

标签: gradle jmh

我想使用JMH,一个OpenJDK微基准测试工具, gradle 。但是,我在编译时获得了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)

5 个答案:

答案 0 :(得分:18)

目前,您只需使用专用插件jmh-gradle-plugin

即可

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

答案 1 :(得分:9)

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

你可以使用shadow 0.8。

答案 2 :(得分:5)

只需完成我的“ masterpiece”即可。没有uber-jars,没有插件,代码库与main&test分开,基准测试编译链接到main,但是在主流生命周期中不会自动运行。简单,明确且易于破解的香草gradle。

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

在进行此操作之前,我花了很多时间来尝试使该插件正常工作,但是按照我的口味,它实在是太笨拙了。

下面的分步细分。

定义一个名为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)

答案 3 :(得分:1)

我制作了一个非常小的示例项目,可以根据需要进行克隆和修改。这是一个完整的工作示例:
https://gitlab.com/barfuin/jmh-gradle-example

它不需要影子罐子和插件。该项目还包括一些额外的 Gradle 任务,用于打印类路径、JMH 选项等,这些内容可能有助于了解正在发生的事情。不过,它不教授微基准测试。 ?

答案 4 :(得分:0)

如果您是IntelliJ用户,那么在没有所有替代方法的情况下,使其工作最简单的方法就是使用IDE插件:

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

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