Skip to content

Commit 14f4f31

Browse files
committed
Experimental support for forks in JMH and async profiler in embedded mode
1 parent 9a082f1 commit 14f4f31

File tree

6 files changed

+47
-20
lines changed

6 files changed

+47
-20
lines changed

examples/kotlin-kts/build.gradle.kts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import org.jetbrains.kotlin.gradle.tasks.*
66

77
plugins {
88
java
9-
kotlin("jvm")
9+
kotlin("jvm")
1010
kotlin("plugin.allopen") version "1.3.50-release-105"
11-
id("kotlinx.benchmark") version "0.2.0"
11+
id("kotlinx.benchmark") version "0.2.0"
1212
}
1313

1414
sourceSets.all {
@@ -17,11 +17,11 @@ sourceSets.all {
1717
}
1818

1919
configure<AllOpenExtension> {
20-
annotation("org.openjdk.jmh.annotations.State")
20+
annotation("org.openjdk.jmh.annotations.State")
2121
}
2222

2323
dependencies {
24-
implementation(kotlin("stdlib-jdk8"))
24+
implementation(kotlin("stdlib-jdk8"))
2525
implementation(project(":kotlinx.benchmark.runtime"))
2626
}
2727

@@ -32,6 +32,13 @@ tasks.withType<KotlinCompile> {
3232
}
3333

3434
benchmark {
35+
configurations {
36+
named("main") {
37+
iterationTime = 5
38+
iterationTimeUnit = "sec"
39+
40+
}
41+
}
3542
targets {
3643
register("main") {
3744
this as JvmBenchmarkTarget

examples/kotlin-multiplatform/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ benchmark {
9393
iterations = 5 // number of iterations
9494
iterationTime = 300
9595
iterationTimeUnit = "ms"
96+
advanced("forks", 3)
9697
}
9798

9899
params {
@@ -110,6 +111,7 @@ benchmark {
110111
iterations = 1
111112
iterationTime = 300 // time in ms per iteration
112113
iterationTimeUnit = "ms" // time in ms per iteration
114+
advanced("forks", 1)
113115
}
114116
}
115117

plugin/main/src/kotlinx/benchmark/gradle/BenchmarkConfiguration.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ open class BenchmarkConfiguration(val extension: BenchmarksExtension, val name:
1414
var includes: MutableList<String> = mutableListOf()
1515
var excludes: MutableList<String> = mutableListOf()
1616
var params: MutableMap<String, MutableList<Any?>> = mutableMapOf()
17+
var advanced: MutableMap<String, Any?> = mutableMapOf()
1718

1819
fun include(pattern: String) {
1920
includes.add(pattern)
@@ -28,6 +29,10 @@ open class BenchmarkConfiguration(val extension: BenchmarksExtension, val name:
2829
values.addAll(value)
2930
}
3031

32+
fun advanced(name: String, value: Any?) {
33+
advanced[name] = value
34+
}
35+
3136
fun capitalizedName() = if (name == "main") "" else name.capitalize()
3237
fun prefixName(suffix: String) = if (name == "main") suffix else name + suffix.capitalize()
3338
}

plugin/main/src/kotlinx/benchmark/gradle/Utils.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ fun writeParameters(
9898
config.params.forEach { (param, values) ->
9999
values.forEach { value -> appendln("param:$param=$value") }
100100
}
101+
config.advanced.forEach { (param, value) ->
102+
appendln("$param:$value")
103+
}
101104
})
102105
return file
103106
}

runtime/commonMain/src/kotlinx/benchmark/RunnerConfiguration.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class RunnerConfiguration(config: String) {
3232
val iterationTime = singleValueOrNull("iterationTime") { it.toLong() }
3333
val iterationTimeUnit = singleValueOrNull("iterationTimeUnit") { parseTimeUnit(it) }
3434

35+
val forks = singleValueOrNull("forks") { it.toInt() }
36+
3537
val outputTimeUnit = singleValueOrNull(
3638
"outputTimeUnit"
3739
) { parseTimeUnit(it) }

runtime/jvmMain/src/kotlinx/benchmark/jvm/JvmBenchmarkRunner.kt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,58 @@ import org.openjdk.jmh.runner.*
88
import org.openjdk.jmh.runner.format.*
99
import org.openjdk.jmh.runner.options.*
1010
import java.io.*
11+
import java.lang.management.*
1112
import java.util.concurrent.*
1213

14+
1315
fun main(args: Array<String>) {
14-
val params = RunnerConfiguration(args[0].readConfigFile())
16+
val config = RunnerConfiguration(args[0].readConfigFile())
1517

1618
val jmhOptions = OptionsBuilder()
17-
params.iterations?.let { jmhOptions.measurementIterations(it) }
18-
params.warmups?.let { jmhOptions.warmupIterations(it) }
19-
params.iterationTime?.let {
20-
val timeValue = TimeValue(it, params.iterationTimeUnit ?: TimeUnit.SECONDS)
19+
config.iterations?.let { jmhOptions.measurementIterations(it) }
20+
config.warmups?.let { jmhOptions.warmupIterations(it) }
21+
config.iterationTime?.let {
22+
val timeValue = TimeValue(it, config.iterationTimeUnit ?: TimeUnit.SECONDS)
2123
jmhOptions.warmupTime(timeValue)
2224
jmhOptions.measurementTime(timeValue)
2325
}
24-
params.outputTimeUnit?.let {
26+
config.outputTimeUnit?.let {
2527
jmhOptions.timeUnit(it)
2628
}
27-
params.mode?.let {
29+
config.mode?.let {
2830
jmhOptions.mode(it)
2931
}
3032

31-
params.include.forEach {
33+
config.include.forEach {
3234
jmhOptions.include(it)
3335
}
34-
params.exclude.forEach {
36+
config.exclude.forEach {
3537
jmhOptions.exclude(it)
3638
}
3739

38-
params.params.forEach { (key, value) ->
40+
config.params.forEach { (key, value) ->
3941
jmhOptions.param(key, *value.toTypedArray())
4042
}
4143

42-
jmhOptions.forks(1)
43-
44-
val reporter = BenchmarkProgress.create(params.traceFormat)
45-
val output = JmhOutputFormat(reporter, params.name)
44+
val runtimeMXBean = ManagementFactory.getRuntimeMXBean()
45+
val jvmArgs = runtimeMXBean.inputArguments
46+
when {
47+
jvmArgs.any { it.contains("libasyncProfiler") } -> jmhOptions.forks(0)
48+
config.forks == null -> jmhOptions.forks(1)
49+
config.forks > 0 -> jmhOptions.forks(config.forks)
50+
}
51+
52+
val reporter = BenchmarkProgress.create(config.traceFormat)
53+
val output = JmhOutputFormat(reporter, config.name)
4654
try {
4755
val runner = Runner(jmhOptions.build(), output)
4856
val results = runner.run()
49-
val resultFormat = ResultFormatFactory.getInstance(ResultFormatType.JSON, PrintStream(File(params.reportFile)))
57+
val resultFormat = ResultFormatFactory.getInstance(ResultFormatType.JSON, PrintStream(File(config.reportFile)))
5058
resultFormat.writeOut(results)
5159
} catch (e: Exception) {
5260
e.printStackTrace()
5361
reporter.endBenchmark(
54-
params.name,
62+
config.name,
5563
output.lastBenchmarkStart,
5664
BenchmarkProgress.FinishStatus.Failure,
5765
e.message ?: "<unknown error>"

0 commit comments

Comments
 (0)