From 151448274bb749f7777fa65158819590ef482e18 Mon Sep 17 00:00:00 2001 From: Johan Bay Date: Mon, 27 Jun 2022 16:03:17 +0200 Subject: [PATCH] [K/N] Add concurrent version of Splay benchmark --- .../performance/ring/src/main/kotlin/main.kt | 8 ++++++++ .../org/jetbrains/ring/SplayBenchmark.kt | 18 ++++++++++++++++++ .../jetbrains/benchmarksLauncher/launcher.kt | 6 +++--- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/kotlin-native/performance/ring/src/main/kotlin/main.kt b/kotlin-native/performance/ring/src/main/kotlin/main.kt index f1395f4b2d2..7fdffafcc8f 100644 --- a/kotlin-native/performance/ring/src/main/kotlin/main.kt +++ b/kotlin-native/performance/ring/src/main/kotlin/main.kt @@ -61,6 +61,7 @@ class RingLauncher : Launcher() { "Richards" to BenchmarkEntryWithInit.create(::RichardsBenchmark, { runRichards() }), "Singleton.access" to BenchmarkEntryWithInit.create(::SingletonBenchmark, { access() }), "Splay" to BenchmarkEntryWithInitAndValidation.create(::SplayBenchmark, { runSplay() }, { splayTearDown() }), + "SplayWithWorkers" to BenchmarkEntryWithInitAndValidation.create(::SplayBenchmarkUsingWorkers, { runSplayWorkers() }, { splayTearDownWorkers() }), "String.stringConcat" to BenchmarkEntryWithInit.create(::StringBenchmark, { stringConcat() }), "String.stringBuilderConcat" to BenchmarkEntryWithInit.create(::StringBenchmark, { stringBuilderConcat() }), "String.stringBuilderConcatNullable" to BenchmarkEntryWithInit.create(::StringBenchmark, { stringBuilderConcatNullable() }), @@ -229,6 +230,13 @@ class RingLauncher : Launcher() { "LocalObjects.localArray" to BenchmarkEntryWithInit.create(::LocalObjectsBenchmark, { localArray() }), "ComplexArrays.outerProduct" to BenchmarkEntryWithInit.create(::ComplexArraysBenchmark, { outerProduct() }), ) + + init { + @OptIn(kotlin.ExperimentalStdlibApi::class) + if (!isExperimentalMM()) { + baseBenchmarksSet -= listOf("SplayWithWorkers") + } + } } fun main(args: Array) { diff --git a/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/SplayBenchmark.kt b/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/SplayBenchmark.kt index 8c3ba6d885f..9ab64e2c46d 100644 --- a/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/SplayBenchmark.kt +++ b/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/SplayBenchmark.kt @@ -41,6 +41,7 @@ // also has to deal with a lot of changes to the large tree object // graph. +import kotlin.native.concurrent.* import kotlin.random.Random // A splay tree is a self-balancing binary search tree with the additional @@ -301,3 +302,20 @@ class SplayBenchmark { } } } + +class SplayBenchmarkUsingWorkers { + val numberOfWorkers = 5; + val workers = Array(numberOfWorkers, { _ -> Worker.start() }) + val splayTrees = Array(numberOfWorkers, { _ -> SplayBenchmark() }); + + fun runSplayWorkers() { + val futures = Array(numberOfWorkers) {i -> workers[i].execute(TransferMode.SAFE, { splayTrees[i] }, {it.runSplay()})}; + futures.forEach{it.consume {}}; + } + + fun splayTearDownWorkers() { + val futures = Array(numberOfWorkers) {i -> workers[i].execute(TransferMode.SAFE, { splayTrees[i] }, {it.splayTearDown()})}; + futures.forEach{it.consume {}}; + workers.forEach { it.requestTermination().result } + } +} diff --git a/kotlin-native/performance/shared/src/main/kotlin/org/jetbrains/benchmarksLauncher/launcher.kt b/kotlin-native/performance/shared/src/main/kotlin/org/jetbrains/benchmarksLauncher/launcher.kt index 12ec4087333..5d2a0a7711e 100644 --- a/kotlin-native/performance/shared/src/main/kotlin/org/jetbrains/benchmarksLauncher/launcher.kt +++ b/kotlin-native/performance/shared/src/main/kotlin/org/jetbrains/benchmarksLauncher/launcher.kt @@ -50,9 +50,6 @@ abstract class Launcher { while (i-- > 0) benchmark.lambda(benchmarkInstance!!) cleanup() } - if (benchmark is BenchmarkEntryWithInitAndValidation) { - benchmark.validation(benchmarkInstance!!) - } result } else if (benchmark is BenchmarkEntry) { cleanup() @@ -109,6 +106,9 @@ abstract class Launcher { // Save benchmark object recordMeasurement(RecordTimeMeasurement(BenchmarkResult.Status.PASSED, k, numWarmIterations, scaledTime)) } + if (benchmark is BenchmarkEntryWithInitAndValidation) { + benchmark.validation(benchmarkInstance!!) + } logger.log("\n", usePrefix = false) }