我想使用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)
答案 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