summaryrefslogtreecommitdiff
path: root/simulator/opendc-simulator
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-03-26 16:30:09 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-03-26 16:30:09 +0100
commitccd1f96f8568978c80aa0b9a100ca6158ade34ba (patch)
tree61ff9309d3fafea786b02ff3c883083cbd59ab3f /simulator/opendc-simulator
parentb0bdbba1c0d9fa1f90eb2831b53340a77b87d949 (diff)
simulator: Cache remaining work
This change updates the resource model implementation to cache the remaining work field, which was being computed multiple times during the same cycle.
Diffstat (limited to 'simulator/opendc-simulator')
-rw-r--r--simulator/opendc-simulator/opendc-simulator-resources/src/main/kotlin/org/opendc/simulator/resources/SimAbstractResourceContext.kt14
1 files changed, 13 insertions, 1 deletions
diff --git a/simulator/opendc-simulator/opendc-simulator-resources/src/main/kotlin/org/opendc/simulator/resources/SimAbstractResourceContext.kt b/simulator/opendc-simulator/opendc-simulator-resources/src/main/kotlin/org/opendc/simulator/resources/SimAbstractResourceContext.kt
index 9705bd17..5c5ee038 100644
--- a/simulator/opendc-simulator/opendc-simulator-resources/src/main/kotlin/org/opendc/simulator/resources/SimAbstractResourceContext.kt
+++ b/simulator/opendc-simulator/opendc-simulator-resources/src/main/kotlin/org/opendc/simulator/resources/SimAbstractResourceContext.kt
@@ -54,8 +54,17 @@ public abstract class SimAbstractResourceContext(
override val remainingWork: Double
get() {
val activeCommand = activeCommand ?: return 0.0
- return computeRemainingWork(activeCommand, clock.millis())
+ val now = clock.millis()
+
+ return if (_remainingWorkFlush < now) {
+ _remainingWorkFlush = now
+ computeRemainingWork(activeCommand, now).also { _remainingWork = it }
+ } else {
+ _remainingWork
+ }
}
+ private var _remainingWork: Double = 0.0
+ private var _remainingWorkFlush: Long = Long.MIN_VALUE
/**
* A flag to indicate the state of the context.
@@ -201,6 +210,9 @@ public abstract class SimAbstractResourceContext(
// Flush may not be called when the resource consumer has finished
throw IllegalStateException()
}
+
+ // Flush remaining work cache
+ _remainingWorkFlush = Long.MIN_VALUE
} catch (cause: Throwable) {
doStop(cause)
} finally {