summaryrefslogtreecommitdiff
path: root/opendc-compute
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-20 15:17:49 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-20 15:17:49 +0200
commite765316cfc089dd50602759ea7afbcc7a3cd4c00 (patch)
tree8a1d73cce375557690082aa10e2870437dad5d9a /opendc-compute
parent768bfa0d2ae763e359d74612385ce43c41afb432 (diff)
perf(compute): Use index lookup in trace loader
This change updates the ComputeWorkloadLoader to use index column lookups in order to prevent having to lookup the index for every row.
Diffstat (limited to 'opendc-compute')
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadLoader.kt34
1 files changed, 24 insertions, 10 deletions
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadLoader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadLoader.kt
index 8a2585ce..ab7f051f 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadLoader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadLoader.kt
@@ -27,6 +27,8 @@ import org.opendc.simulator.compute.workload.SimTraceWorkload
import org.opendc.trace.*
import org.opendc.trace.opendc.OdcVmTraceFormat
import java.io.File
+import java.time.Duration
+import java.time.Instant
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import kotlin.math.roundToLong
@@ -58,15 +60,21 @@ public class ComputeWorkloadLoader(private val baseDir: File) {
private fun parseFragments(trace: Trace): Map<String, List<SimTraceWorkload.Fragment>> {
val reader = checkNotNull(trace.getTable(TABLE_RESOURCE_STATES)).newReader()
+ val idCol = reader.resolve(RESOURCE_ID)
+ val timestampCol = reader.resolve(RESOURCE_STATE_TIMESTAMP)
+ val durationCol = reader.resolve(RESOURCE_STATE_DURATION)
+ val coresCol = reader.resolve(RESOURCE_CPU_COUNT)
+ val usageCol = reader.resolve(RESOURCE_STATE_CPU_USAGE)
+
val fragments = mutableMapOf<String, MutableList<SimTraceWorkload.Fragment>>()
return try {
while (reader.nextRow()) {
- val id = reader.get(RESOURCE_ID)
- val time = reader.get(RESOURCE_STATE_TIMESTAMP)
- val duration = reader.get(RESOURCE_STATE_DURATION)
- val cores = reader.getInt(RESOURCE_CPU_COUNT)
- val cpuUsage = reader.getDouble(RESOURCE_STATE_CPU_USAGE)
+ val id = reader.get(idCol) as String
+ val time = reader.get(timestampCol) as Instant
+ val duration = reader.get(durationCol) as Duration
+ val cores = reader.getInt(coresCol)
+ val cpuUsage = reader.getDouble(usageCol)
val fragment = SimTraceWorkload.Fragment(
time.toEpochMilli(),
@@ -90,21 +98,27 @@ public class ComputeWorkloadLoader(private val baseDir: File) {
private fun parseMeta(trace: Trace, fragments: Map<String, List<SimTraceWorkload.Fragment>>): List<VirtualMachine> {
val reader = checkNotNull(trace.getTable(TABLE_RESOURCES)).newReader()
+ val idCol = reader.resolve(RESOURCE_ID)
+ val startTimeCol = reader.resolve(RESOURCE_START_TIME)
+ val stopTimeCol = reader.resolve(RESOURCE_STOP_TIME)
+ val coresCol = reader.resolve(RESOURCE_CPU_COUNT)
+ val memCol = reader.resolve(RESOURCE_MEM_CAPACITY)
+
var counter = 0
val entries = mutableListOf<VirtualMachine>()
return try {
while (reader.nextRow()) {
- val id = reader.get(RESOURCE_ID)
+ val id = reader.get(idCol) as String
if (!fragments.containsKey(id)) {
continue
}
- val submissionTime = reader.get(RESOURCE_START_TIME)
- val endTime = reader.get(RESOURCE_STOP_TIME)
- val maxCores = reader.getInt(RESOURCE_CPU_COUNT)
- val requiredMemory = reader.getDouble(RESOURCE_MEM_CAPACITY) / 1000.0 // Convert from KB to MB
+ val submissionTime = reader.get(startTimeCol) as Instant
+ val endTime = reader.get(stopTimeCol) as Instant
+ val maxCores = reader.getInt(coresCol)
+ val requiredMemory = reader.getDouble(memCol) / 1000.0 // Convert from KB to MB
val uid = UUID.nameUUIDFromBytes("$id-${counter++}".toByteArray())
val vmFragments = fragments.getValue(id).asSequence()