From 808ea110725348c58420b4f4a6795700374db195 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 15 Sep 2021 17:28:35 +0200 Subject: [PATCH] [Commonizer] Improve access performance for TargetDependent ^KT-48288 --- .../kotlin/commonizer/TargetDependent.kt | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt index 9b30f74ef60..ee851575421 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.commonizer +import gnu.trove.THashMap + sealed interface TargetDependent : Iterable { val size: Int get() = targets.size val targets: List @@ -111,27 +113,24 @@ private class FactoryBasedTargetDependent( private var factory: ((target: CommonizerTarget) -> T)? ) : TargetDependent { + private object Null private object Uninitialized - private val values: Array = Array(targets.size) { Uninitialized } + private val values = targets.associateWithTo(THashMap(targets.size)) { Uninitialized } @Suppress("UNCHECKED_CAST") override fun get(target: CommonizerTarget): T { - val indexOfTarget = indexOf(target) - if (indexOfTarget < 0) throwMissingTarget(target) - val storedValue = values[indexOfTarget] - if (storedValue == Uninitialized) { - val producedValue = factory?.invoke(target) - values[indexOfTarget] = producedValue - - /* All values initialized. Factory can be released */ - if (values.none { it === Uninitialized }) { + val value = values[target] ?: throwMissingTarget(target) + if (value === Null) return null as T + if (value === Uninitialized) { + val initializedValue = checkNotNull(factory)(target) + values[target] = initializedValue ?: Null + if (values.none { it.value !== Uninitialized }) { factory = null } - return producedValue as T + return initializedValue } - - return storedValue as T + return value as T } }