问题描述
我目前正在使用一个插件在Java代码上运行基准测试,并且我使用了jmh-gradle-plugin来做到这一点。
该插件允许使用jmh
代码块方便地描述JMH配置:
jmh {
include = ["List"]
benchmarkParameters=["seed": ["1","2","3","4","5"],"applicationSize":["100","1000"],"baseStructureSize":["100","1000"]]
fork=2
timeOnIteration="250ms"
iterations=2
warmup="250ms"
warmupIterations=2
fork=2
resultFormat="CSV"
benchmarkMode=["ss"]
timeUnit="ms"
failOnError = true
}
这很有用,但我想对同一任务使用不同类型,例如,一种输出为CSV,一种输出为JSON。我知道可以使用resultFormat=<format>
进行配置,但是我找不到一种“复制”任务并对每个变体使用不同配置的方法。
Gradle documentation has a page关于配置任务,但它们配置Copy
任务。我以为我可以遵循类似的方式写:
task myJMH(type: me.champeau.gradle.JMHTask) {
resultFormat="JSON"
}
但是,正如我在this issue中提到的那样,方法行不通。我认为JMH任务可能有所不同。注册具有该名称的类是可行的,但无法对其进行配置。我收到以下错误:
Could not set unknown property 'include' for task ':myJMH' of type me.champeau.gradle.JMHTask.
类似地,我想对shadowJar
任务进行各种配置,以便能够生成该任务的几种不同变体,但是我遇到了同样的问题。
解决方法
第一个示例中的jmh
不是任务,而是扩展名 。该插件使用相同的名称注册扩展和任务。实际上,这是Gradle插件的普遍模式。
通常,即使可以使用扩展名配置由插件创建的任务,也仍然可以直接对其进行配置,因为它们仍提供配置属性。任务类型ShadowJar
就是这种情况,因此您可以simply create tasks of that type manually:
// Shadowing Test Sources and Dependencies
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
task testJar(type: ShadowJar) {
classifier = 'tests'
from sourceSets.test.output
configurations = [project.configurations.testRuntime]
}
可悲的是,任务类型JMHTask
的实现方式是,它仅从扩展名中检索配置,因此任何实例都将使用相同的配置。
但是,您可以尝试以下解决方法:
创建用于配置扩展程序的任务,然后将其与jmh
任务一起执行:
jmh {
include = ["List"]
benchmarkParameters=["seed": ["1","2","3","4","5"],"applicationSize":["100","1000"],"baseStructureSize":["100","1000"]]
fork=2
timeOnIteration="250ms"
iterations=2
warmup="250ms"
warmupIterations=2
fork=2
benchmarkMode=["ss"]
timeUnit="ms"
failOnError = true
}
task jmhCsv {
doFirst {
jmh.resultFormat="CSV"
}
finalizedBy 'jmh'
}
task jmhJson {
doFirst {
jmh.resultFormat="JSON"
}
finalizedBy 'jmh'
}
请注意,一个任务只能在一个版本中执行一次,因此,如果要在同一运行中运行不同的配置,则此解决方法将不起作用。