From 269860ba2616c32ca8a81ac66b6fbf95c2f1c77d Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 15 May 2020 13:29:25 +0200 Subject: perf: Reduce memory consumption of perf interference model --- .../core/workload/PerformanceInterferenceModel.kt | 46 ++++++++-------------- 1 file changed, 16 insertions(+), 30 deletions(-) (limited to 'opendc/opendc-compute/src') diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt index fab4ae9d..f458877b 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt @@ -40,40 +40,12 @@ const val IMAGE_PERF_INTERFERENCE_MODEL = "image:performance-interference" * @param items The [PerformanceInterferenceModelItem]s that make up this model. */ class PerformanceInterferenceModel( - items: Set, + val items: SortedSet, val random: Random = Random(0) ) { private var intersectingItems: List = emptyList() - private val comparator = Comparator { lhs, rhs -> - var cmp = lhs.performanceScore.compareTo(rhs.performanceScore) - if (cmp != 0) { - return@Comparator cmp - } - - cmp = lhs.minServerLoad.compareTo(rhs.minServerLoad) - if (cmp != 0) { - return@Comparator cmp - } - - lhs.hashCode().compareTo(rhs.hashCode()) - } - val items = TreeSet(comparator) - val workloadToItem: Map> private val colocatedWorkloads = TreeSet() - init { - val workloadToItem = mutableMapOf>() - - for (item in items) { - for (workload in item.workloadNames) { - workloadToItem.getOrPut(workload) { mutableSetOf() }.add(item) - } - this.items.add(item) - } - - this.workloadToItem = workloadToItem - } - fun vmStarted(server: Server) { colocatedWorkloads.add(server.image.name) intersectingItems = items.filter { item -> doesMatch(item) } @@ -123,7 +95,7 @@ data class PerformanceInterferenceModelItem( val workloadNames: SortedSet, val minServerLoad: Double, val performanceScore: Double -) { +) : Comparable { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -136,4 +108,18 @@ data class PerformanceInterferenceModelItem( } override fun hashCode(): Int = workloadNames.hashCode() + + override fun compareTo(other: PerformanceInterferenceModelItem): Int { + var cmp = performanceScore.compareTo(other.performanceScore) + if (cmp != 0) { + return cmp + } + + cmp = minServerLoad.compareTo(other.minServerLoad) + if (cmp != 0) { + return cmp + } + + return hashCode().compareTo(other.hashCode()) + } } -- cgit v1.2.3