summaryrefslogtreecommitdiff
path: root/opendc-simulator/opendc-simulator-resources/src/jmh
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-27 16:34:06 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-01 14:48:24 +0200
commit9e5e830e15b74f040708e98c09ea41cd96d13871 (patch)
tree5c2ac6bb2e9a37cc7da36f31092f24c33fb2e15c /opendc-simulator/opendc-simulator-resources/src/jmh
parentcd2e3288d28d23556a81bad76dab0aae2e055ac2 (diff)
simulator: Centralize resource logic in SimResourceInterpreter
This change introduces the SimResourceInterpreter which centralizes the logic for scheduling and interpreting the communication between resource consumer and provider. This approach offers better performance due to avoiding invalidating the state of the resource context when not necessary. Benchmarks show in the best case a 5x performance improvement and at worst a 2x improvement.
Diffstat (limited to 'opendc-simulator/opendc-simulator-resources/src/jmh')
-rw-r--r--opendc-simulator/opendc-simulator-resources/src/jmh/kotlin/org/opendc/simulator/resources/SimResourceBenchmarks.kt30
1 files changed, 15 insertions, 15 deletions
diff --git a/opendc-simulator/opendc-simulator-resources/src/jmh/kotlin/org/opendc/simulator/resources/SimResourceBenchmarks.kt b/opendc-simulator/opendc-simulator-resources/src/jmh/kotlin/org/opendc/simulator/resources/SimResourceBenchmarks.kt
index cd5f33bd..9233c72d 100644
--- a/opendc-simulator/opendc-simulator-resources/src/jmh/kotlin/org/opendc/simulator/resources/SimResourceBenchmarks.kt
+++ b/opendc-simulator/opendc-simulator-resources/src/jmh/kotlin/org/opendc/simulator/resources/SimResourceBenchmarks.kt
@@ -37,12 +37,12 @@ import java.util.concurrent.TimeUnit
@OptIn(ExperimentalCoroutinesApi::class)
class SimResourceBenchmarks {
private lateinit var scope: SimulationCoroutineScope
- private lateinit var scheduler: SimResourceScheduler
+ private lateinit var interpreter: SimResourceInterpreter
@Setup
fun setUp() {
scope = SimulationCoroutineScope()
- scheduler = SimResourceSchedulerTrampoline(scope.coroutineContext, scope.clock)
+ interpreter = SimResourceInterpreter(scope.coroutineContext, scope.clock)
}
@State(Scope.Thread)
@@ -67,7 +67,7 @@ class SimResourceBenchmarks {
@Benchmark
fun benchmarkSource(state: Workload) {
return scope.runBlockingSimulation {
- val provider = SimResourceSource(4200.0, scheduler)
+ val provider = SimResourceSource(4200.0, interpreter)
return@runBlockingSimulation provider.consume(SimTraceConsumer(state.trace))
}
}
@@ -75,7 +75,7 @@ class SimResourceBenchmarks {
@Benchmark
fun benchmarkForwardOverhead(state: Workload) {
return scope.runBlockingSimulation {
- val provider = SimResourceSource(4200.0, scheduler)
+ val provider = SimResourceSource(4200.0, interpreter)
val forwarder = SimResourceForwarder()
provider.startConsumer(forwarder)
return@runBlockingSimulation forwarder.consume(SimTraceConsumer(state.trace))
@@ -85,10 +85,10 @@ class SimResourceBenchmarks {
@Benchmark
fun benchmarkSwitchMaxMinSingleConsumer(state: Workload) {
return scope.runBlockingSimulation {
- val switch = SimResourceSwitchMaxMin(scheduler)
+ val switch = SimResourceSwitchMaxMin(interpreter)
- switch.addInput(SimResourceSource(3000.0, scheduler))
- switch.addInput(SimResourceSource(3000.0, scheduler))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
val provider = switch.addOutput(3500.0)
return@runBlockingSimulation provider.consume(SimTraceConsumer(state.trace))
@@ -98,12 +98,12 @@ class SimResourceBenchmarks {
@Benchmark
fun benchmarkSwitchMaxMinTripleConsumer(state: Workload) {
return scope.runBlockingSimulation {
- val switch = SimResourceSwitchMaxMin(scheduler)
+ val switch = SimResourceSwitchMaxMin(interpreter)
- switch.addInput(SimResourceSource(3000.0, scheduler))
- switch.addInput(SimResourceSource(3000.0, scheduler))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
- repeat(3) { i ->
+ repeat(3) {
launch {
val provider = switch.addOutput(3500.0)
provider.consume(SimTraceConsumer(state.trace))
@@ -117,8 +117,8 @@ class SimResourceBenchmarks {
return scope.runBlockingSimulation {
val switch = SimResourceSwitchExclusive()
- switch.addInput(SimResourceSource(3000.0, scheduler))
- switch.addInput(SimResourceSource(3000.0, scheduler))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
val provider = switch.addOutput(3500.0)
return@runBlockingSimulation provider.consume(SimTraceConsumer(state.trace))
@@ -130,8 +130,8 @@ class SimResourceBenchmarks {
return scope.runBlockingSimulation {
val switch = SimResourceSwitchExclusive()
- switch.addInput(SimResourceSource(3000.0, scheduler))
- switch.addInput(SimResourceSource(3000.0, scheduler))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
+ switch.addInput(SimResourceSource(3000.0, interpreter))
repeat(2) {
launch {