Skip to content

Commit 98ab43e

Browse files
committed
Handle benchmarks that return Promise as defer benchmark in JsBenchmarkSuite
1 parent f47d242 commit 98ab43e

File tree

2 files changed

+71
-5
lines changed

2 files changed

+71
-5
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package test
2+
3+
import org.jetbrains.gradle.benchmarks.*
4+
import kotlin.js.*
5+
6+
@State(Scope.Benchmark)
7+
class JsAsyncBenchmarks {
8+
9+
private var data = 0.0
10+
11+
@Setup
12+
fun setUp() {
13+
data = 42.0
14+
}
15+
16+
@Benchmark
17+
fun baseline(): Double {
18+
// This benchmarks shows that benchmarks.js fails a baseline test :)
19+
return data
20+
}
21+
22+
@Benchmark
23+
fun promiseResolve(): Promise<Double> {
24+
return Promise.resolve(data)
25+
}
26+
27+
@Benchmark
28+
fun promiseResolveDoubleChain(): Promise<Double> {
29+
return Promise.resolve(Unit).then { data }
30+
}
31+
32+
@Benchmark
33+
fun promiseResolveTripleChain(): Promise<Double> {
34+
return Promise.resolve(Unit).then { Unit }.then { data }
35+
}
36+
37+
@Benchmark
38+
fun promiseDelayedBaseline(): Promise<Double> {
39+
// Score of this benchmark cannot be greater than 10 ops/sec
40+
return Promise { resolve, reject ->
41+
setTimeout({
42+
resolve(data)
43+
}, 100)
44+
}
45+
}
46+
47+
}
48+
49+
private external fun setTimeout(handler: dynamic, timeout: Int = definedExternally): Int

runtime/jsMain/src/org/jetbrains/gradle/benchmarks/js/JsBenchmarkSuite.kt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package org.jetbrains.gradle.benchmarks.js
22

33
import kotlinx.cli.*
44
import org.jetbrains.gradle.benchmarks.*
5+
import kotlin.js.*
56
import kotlin.math.*
67

78
external fun require(module: String): dynamic
89
private val benchmarkJs: dynamic = require("benchmark")
9-
private val fs = require("fs");
10-
private val process = require("process");
10+
private val fs = require("fs")
11+
private val process = require("process")
1112

1213
class Suite(val title: String, @Suppress("UNUSED_PARAMETER") dummy_args: Array<out String>) {
1314
private val args = RunnerCommandLine().also { it.parse((process["argv"] as Array<String>).drop(2)) }
@@ -34,12 +35,27 @@ class Suite(val title: String, @Suppress("UNUSED_PARAMETER") dummy_args: Array<o
3435
}
3536
else -> throw UnsupportedOperationException("Format ${args.traceFormat} is not supported.")
3637
}
37-
suite.run()
38-
fs.writeFile(args.reportFile, results.toJson()) { err -> if (err) throw err }
38+
39+
suite.run().on("complete") {
40+
fs.writeFile(args.reportFile, results.toJson()) { err -> if (err != null) throw err }
41+
}
42+
}
43+
44+
fun add(name: String, function: () -> Promise<*>, setup: () -> Unit, teardown: () -> Unit) {
45+
suite.add(name) { deferred: Promise<Unit> ->
46+
// Mind asDynamic: this is **not** a regular promise
47+
function().then { (deferred.asDynamic()).resolve() }
48+
}
49+
50+
configureBenchmark(setup, teardown, isAsynchronous = true)
3951
}
4052

4153
fun add(name: String, function: () -> Any?, setup: () -> Unit, teardown: () -> Unit) {
4254
suite.add(name, function)
55+
configureBenchmark(setup, teardown, isAsynchronous = false)
56+
}
57+
58+
private fun configureBenchmark(setup: () -> Unit, teardown: () -> Unit, isAsynchronous: Boolean) {
4359
val benchmark = suite[suite.length - 1] // take back last added benchmark and subscribe to events
4460

4561
// TODO: Configure properly
@@ -49,6 +65,8 @@ class Suite(val title: String, @Suppress("UNUSED_PARAMETER") dummy_args: Array<o
4965

5066
benchmark.options.minTime = args.iterationTime / 1000.0
5167
benchmark.options.maxTime = args.iterationTime * args.iterations / 1000.0
68+
benchmark.options.async = isAsynchronous
69+
benchmark.options.defer = isAsynchronous
5270

5371
benchmark.on("start") { event ->
5472
val benchmarkFQN = event.target.name
@@ -87,7 +105,6 @@ class Suite(val title: String, @Suppress("UNUSED_PARAMETER") dummy_args: Array<o
87105
else -> throw UnsupportedOperationException("Format ${args.traceFormat} is not supported.")
88106
}
89107

90-
91108
results.add(result)
92109
}
93110
}

0 commit comments

Comments
 (0)