1*cd0cc2e3SAndroid Build Coastguard Workerplugins { 2*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.jmh 3*cd0cc2e3SAndroid Build Coastguard Worker} 4*cd0cc2e3SAndroid Build Coastguard Worker 5*cd0cc2e3SAndroid Build Coastguard Workerdescription = 'Conscrypt: JMH on OpenJDK Benchmarks' 6*cd0cc2e3SAndroid Build Coastguard Worker 7*cd0cc2e3SAndroid Build Coastguard WorkerevaluationDependsOn(':conscrypt-openjdk') 8*cd0cc2e3SAndroid Build Coastguard Worker 9*cd0cc2e3SAndroid Build Coastguard Workerext { 10*cd0cc2e3SAndroid Build Coastguard Worker preferredSourceSet = project(':conscrypt-openjdk').preferredSourceSet 11*cd0cc2e3SAndroid Build Coastguard Worker preferredNativeFileDir = project(':conscrypt-openjdk').preferredNativeFileDir 12*cd0cc2e3SAndroid Build Coastguard Worker 13*cd0cc2e3SAndroid Build Coastguard Worker genDir = "${buildDir}/jmh-generated-classes" 14*cd0cc2e3SAndroid Build Coastguard Worker jmhInclude = System.getProperty('jmh.include') 15*cd0cc2e3SAndroid Build Coastguard Worker jmhParams = System.getProperty('jmh.parameters') 16*cd0cc2e3SAndroid Build Coastguard Worker jmhWarmupIterations = System.getProperty('jmh.wi', '10') 17*cd0cc2e3SAndroid Build Coastguard Worker jmhIterations = System.getProperty('jmh.i', '10') 18*cd0cc2e3SAndroid Build Coastguard Worker jmhFork = System.getProperty('jmh.f', '1') 19*cd0cc2e3SAndroid Build Coastguard Worker jmhJvm = System.getProperty('jmh.jvm') 20*cd0cc2e3SAndroid Build Coastguard Worker jmhJvmArgs = System.getProperty('jmh.jvmArgs', '-server -Xms2g -Xmx2g') 21*cd0cc2e3SAndroid Build Coastguard Worker} 22*cd0cc2e3SAndroid Build Coastguard Worker 23*cd0cc2e3SAndroid Build Coastguard Workerjmh { 24*cd0cc2e3SAndroid Build Coastguard Worker jmhVersion = "$jmhVersion" 25*cd0cc2e3SAndroid Build Coastguard Worker if (jmhInclude != null) { 26*cd0cc2e3SAndroid Build Coastguard Worker setInclude(jmhInclude.toString()) 27*cd0cc2e3SAndroid Build Coastguard Worker } 28*cd0cc2e3SAndroid Build Coastguard Worker if (jmhParams != null) { 29*cd0cc2e3SAndroid Build Coastguard Worker setBenchmarkParameters(parseParams(jmhParams)) 30*cd0cc2e3SAndroid Build Coastguard Worker } 31*cd0cc2e3SAndroid Build Coastguard Worker warmupIterations = "$jmhWarmupIterations".toInteger() 32*cd0cc2e3SAndroid Build Coastguard Worker iterations = "$jmhIterations".toInteger() 33*cd0cc2e3SAndroid Build Coastguard Worker fork = "$jmhFork".toInteger() 34*cd0cc2e3SAndroid Build Coastguard Worker // jvmArgs = jmhJvmArgs 35*cd0cc2e3SAndroid Build Coastguard Worker if (jmhJvm != null) { 36*cd0cc2e3SAndroid Build Coastguard Worker jvm = jmhJvm 37*cd0cc2e3SAndroid Build Coastguard Worker } 38*cd0cc2e3SAndroid Build Coastguard Worker duplicateClassesStrategy = DuplicatesStrategy.WARN 39*cd0cc2e3SAndroid Build Coastguard Worker} 40*cd0cc2e3SAndroid Build Coastguard Worker 41*cd0cc2e3SAndroid Build Coastguard Workerconfigurations { 42*cd0cc2e3SAndroid Build Coastguard Worker // The JMH plugin by defaults depends on all of the generators for an old version of JMH. 43*cd0cc2e3SAndroid Build Coastguard Worker // Need to remove all the generators that we're not explicitly overriding to eliminate the 44*cd0cc2e3SAndroid Build Coastguard Worker // dependency on the old version of JMH. 45*cd0cc2e3SAndroid Build Coastguard Worker jmh.exclude module:'jmh-generator-asm' 46*cd0cc2e3SAndroid Build Coastguard Worker 47*cd0cc2e3SAndroid Build Coastguard Worker jmhGeneratorAnnprocess 48*cd0cc2e3SAndroid Build Coastguard Worker} 49*cd0cc2e3SAndroid Build Coastguard Worker 50*cd0cc2e3SAndroid Build Coastguard WorkersourceSets { 51*cd0cc2e3SAndroid Build Coastguard Worker sourceSets { 52*cd0cc2e3SAndroid Build Coastguard Worker main { 53*cd0cc2e3SAndroid Build Coastguard Worker resources { 54*cd0cc2e3SAndroid Build Coastguard Worker // This shouldn't be needed but seems to help IntelliJ locate 55*cd0cc2e3SAndroid Build Coastguard Worker // META_INF/BenchmarkList. 56*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += genDir 57*cd0cc2e3SAndroid Build Coastguard Worker 58*cd0cc2e3SAndroid Build Coastguard Worker // This shouldn't be needed but seems to help IntelliJ locate the native artifact. 59*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += preferredNativeFileDir 60*cd0cc2e3SAndroid Build Coastguard Worker } 61*cd0cc2e3SAndroid Build Coastguard Worker } 62*cd0cc2e3SAndroid Build Coastguard Worker } 63*cd0cc2e3SAndroid Build Coastguard Worker} 64*cd0cc2e3SAndroid Build Coastguard Worker 65*cd0cc2e3SAndroid Build Coastguard Workerdependencies { 66*cd0cc2e3SAndroid Build Coastguard Worker implementation project(":conscrypt-openjdk"), 67*cd0cc2e3SAndroid Build Coastguard Worker project(path: ":conscrypt-testing", configuration: "runtimeElements"), 68*cd0cc2e3SAndroid Build Coastguard Worker project(':conscrypt-benchmark-base'), 69*cd0cc2e3SAndroid Build Coastguard Worker // Add the preferred native openjdk configuration for this platform. 70*cd0cc2e3SAndroid Build Coastguard Worker //project(':conscrypt-openjdk').sourceSets["$preferredSourceSet"].output, 71*cd0cc2e3SAndroid Build Coastguard Worker libs.junit, 72*cd0cc2e3SAndroid Build Coastguard Worker libs.netty.handler, 73*cd0cc2e3SAndroid Build Coastguard Worker libs.netty.tcnative 74*cd0cc2e3SAndroid Build Coastguard Worker 75*cd0cc2e3SAndroid Build Coastguard Worker jmhGeneratorAnnprocess libs.jmh.generator.annprocess 76*cd0cc2e3SAndroid Build Coastguard Worker 77*cd0cc2e3SAndroid Build Coastguard Worker // Override the default JMH dependencies with the new versions. 78*cd0cc2e3SAndroid Build Coastguard Worker jmh libs.jmh.core, 79*cd0cc2e3SAndroid Build Coastguard Worker libs.jmh.generator.reflection, 80*cd0cc2e3SAndroid Build Coastguard Worker libs.jmh.generator.bytecode 81*cd0cc2e3SAndroid Build Coastguard Worker} 82*cd0cc2e3SAndroid Build Coastguard Worker 83*cd0cc2e3SAndroid Build Coastguard Worker// Running benchmarks in IntelliJ seems broken without this. 84*cd0cc2e3SAndroid Build Coastguard Worker// See https://github.com/melix/jmh-gradle-plugin/issues/39 85*cd0cc2e3SAndroid Build Coastguard Worker// TODO(prb): Investigate and fix for Gradle 7+ 86*cd0cc2e3SAndroid Build Coastguard Worker//idea.module { 87*cd0cc2e3SAndroid Build Coastguard Worker// scopes.PROVIDED.plus += [ configurations.compile, configurations.jmh ] 88*cd0cc2e3SAndroid Build Coastguard Worker//} 89*cd0cc2e3SAndroid Build Coastguard Worker 90*cd0cc2e3SAndroid Build Coastguard Worker// Param strings are in the form "param:VAL1,VAL2;param2:VAL3,VAL4" 91*cd0cc2e3SAndroid Build Coastguard Workerstatic def parseParams(s) { 92*cd0cc2e3SAndroid Build Coastguard Worker // It's really easy to type jmh.parameters=foo=bar instead of jmh.parameters=foo:bar, 93*cd0cc2e3SAndroid Build Coastguard Worker // so check for that. 94*cd0cc2e3SAndroid Build Coastguard Worker if (s.contains("=")) { 95*cd0cc2e3SAndroid Build Coastguard Worker throw new IllegalArgumentException("jmh.parameters value shouldn't include '='. (Did you mean ':'?)") 96*cd0cc2e3SAndroid Build Coastguard Worker } 97*cd0cc2e3SAndroid Build Coastguard Worker return s.split(";").collectEntries { entry -> 98*cd0cc2e3SAndroid Build Coastguard Worker def pair = entry.split(":") 99*cd0cc2e3SAndroid Build Coastguard Worker [ (pair.first().trim()) : pair.last().split(",").collect { it.trim() } ] 100*cd0cc2e3SAndroid Build Coastguard Worker } 101*cd0cc2e3SAndroid Build Coastguard Worker} 102