如何在Kotlin中编写JMH基准测试而不使用melix/jmh-gradle-plugin?

pxy2qtax  于 2023-03-30  发布在  Kotlin
关注(0)|答案(1)|浏览(153)

使用plugin编写并运行Kotlin基准测试。据我所知,jmh专注于编写基准测试,然后构建jar应用程序,并启动应用程序本身。我想知道是否可以使用jmh的强大功能来类比单元测试,就像项目中作为构建任务运行的部分一样。
我在Kotlin项目中使用gradle。我希望用gradle lib:runBenchmark这样的命令调用基准测试。me.champeau.jmh插件对我来说似乎是多余的,因为有传说(for example)说,只需创建JavaExec类型的gradle任务并运行org.openjdk.jmh.Main类,向其传递某些参数就足够了。
到目前为止,我已经设法以类似的方式运行了用java编写的基准测试,但jmh顽固地拒绝开始看到用Kotlin编写的带注解的类。

quhf5bfb

quhf5bfb1#

org.openjdk.jmh有一个工具jmh-generator-bytecode。使用它,你可以在gradle中创建一个任务,从集合中生成必要的代码(kotlinjava都不重要):

val outputSourceDir = File(buildDir, "jmhGenerated/sources")
val outputResourceDir = File(buildDir, "jmhGenerated/resources")
// Usage: generator <compiled-bytecode-dir> <output-source-dir> <output-resource-dir> [generator-type]
val generatorTask = task<JavaExec>("jmhRunBytecodeGenerator") {
    dependsOn("classes")
    mainClass.set("org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator")
    classpath = sourceSets["jmh"].runtimeClasspath
    args(
        compiledBytecodePath,
        outputSourceDir.absolutePath,
        outputResourceDir.absolutePath,
        "default"
    )
}

然后你可以编译前面生成的代码:

val outputClassesDir = File(buildDir, "jmhGenerated/classes")
val compileTask = task<JavaCompile>("jmhCompileGenerated") {
    dependsOn(generatorTask)
    classpath = sourceSets["jmh"].runtimeClasspath
    source(outputSourceDir)
    destinationDirectory.set(outputClassesDir)
}

最后,使用一个任务运行基准测试,在该任务中,您可以将路径传递到编译的新类:

task<JavaExec>("runBenchmark") {
    dependsOn(compileGeneratedTask)
    doFirst {
        File(buildDir, "reports/jmh").mkdirs()
    }
    mainClass.set("org.openjdk.jmh.Main")
    classpath(
        sourceSets["jmh"].runtimeClasspath,
        outputResourceDir,
        outputClassesDir
    )
    args(TODO())
}

Here你可以看到一个例子,我如何使用这个方法在我的项目。

相关问题