diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-09-20 15:17:49 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-09-20 15:17:49 +0200 |
| commit | e765316cfc089dd50602759ea7afbcc7a3cd4c00 (patch) | |
| tree | 8a1d73cce375557690082aa10e2870437dad5d9a /opendc-compute | |
| parent | 768bfa0d2ae763e359d74612385ce43c41afb432 (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.kt | 34 |
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() |
