Skip to content

Commit a67a507

Browse files
committed
Add anti-inlining bridge to wasm builtin executor
1 parent fc24c04 commit a67a507

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

runtime/jsMain/src/kotlinx/benchmark/js/JsBuiltInExecutor.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@ package kotlinx.benchmark.js
33
import kotlinx.benchmark.*
44
import kotlinx.benchmark.jsEngineSupport
55

6-
@JsName("Function")
7-
private external fun functionCtor(params: String, code: String): (dynamic) -> Long
8-
96
class JsBuiltInExecutor(
107
name: String,
118
@Suppress("UNUSED_PARAMETER") dummy_args: Array<out String>
129
) : CommonSuiteExecutor(name, jsEngineSupport.arguments()[0]) {
1310

14-
private val BenchmarkConfiguration.jsUseBridge: Boolean
15-
get() = "true".equals(advanced["jsUseBridge"], ignoreCase = true)
11+
private val BenchmarkConfiguration.notUseJsBridge: Boolean
12+
get() = "false".equals(advanced["jsUseBridge"], ignoreCase = true)
1613

1714
override fun run(
1815
runnerConfiguration: RunnerConfiguration,
@@ -26,16 +23,8 @@ class JsBuiltInExecutor(
2623
super.run(runnerConfiguration, benchmarks, start, complete)
2724
}
2825

29-
private fun createJsMeasurerBridge(originalMeasurer: () -> Long): () -> Long {
30-
val bridgeObject = object {
31-
fun invoke(): Long = originalMeasurer.invoke()
32-
}
33-
val measurerString = bridgeObject::invoke.toString()
34-
val measurerBody = measurerString.substringAfter("{").substringBeforeLast("}")
35-
return {
36-
functionCtor("\$boundThis", measurerBody)(bridgeObject)
37-
}
38-
}
26+
private fun createJsMeasurerBridge(originalMeasurer: () -> Long): () -> Long =
27+
{ originalMeasurer() }
3928

4029
override fun <T> createIterationMeasurer(
4130
instance: T,
@@ -44,6 +33,6 @@ class JsBuiltInExecutor(
4433
cycles: Int
4534
): () -> Long {
4635
val measurer = super.createIterationMeasurer(instance, benchmark, configuration, cycles)
47-
return if (configuration.jsUseBridge) createJsMeasurerBridge(measurer) else measurer
36+
return if (configuration.notUseJsBridge) measurer else createJsMeasurerBridge(measurer)
4837
}
4938
}

runtime/wasmMain/src/kotlinx/benchmark/wasm/WasmBuiltInExecutor.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,28 @@ package kotlinx.benchmark.wasm
22

33
import kotlinx.benchmark.*
44

5+
@JsFun("(p) => p")
6+
private external fun id(p: Any): Any
7+
58
class WasmBuiltInExecutor(
69
name: String,
710
@Suppress("UNUSED_PARAMETER") dummy_args: Array<out String>
8-
) : CommonSuiteExecutor(name, jsEngineSupport.arguments()[0])
11+
) : CommonSuiteExecutor(name, jsEngineSupport.arguments()[0]) {
12+
13+
private val BenchmarkConfiguration.notUseJsBridge: Boolean
14+
get() = "false".equals(advanced["jsUseBridge"], ignoreCase = true)
15+
16+
@Suppress("UNCHECKED_CAST")
17+
private fun createJsMeasurerBridge(originalMeasurer: () -> Long): () -> Long =
18+
id(originalMeasurer) as (() -> Long)
19+
20+
override fun <T> createIterationMeasurer(
21+
instance: T,
22+
benchmark: BenchmarkDescriptor<T>,
23+
configuration: BenchmarkConfiguration,
24+
cycles: Int
25+
): () -> Long {
26+
val measurer = super.createIterationMeasurer(instance, benchmark, configuration, cycles)
27+
return if (configuration.notUseJsBridge) measurer else createJsMeasurerBridge(measurer)
28+
}
29+
}

0 commit comments

Comments
 (0)