From 6eda2742ffadece1f0bd825bacd968d2a6e62be5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 17 Feb 2023 12:57:42 +0100 Subject: [PATCH] [LL FIR] optimize time spent in LLFirSessionsCache.getSessions The most time were spent in `PersistentMap.get`, replacement to regular hash map should help. This is thread-safe as we safe-publish the value via the volatile field `mappings` ^KTIJ-24697 fixed --- .../level/api/fir/sessions/LLFirSessionProviderStorage.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt index c96d7ca0256..8d94c8d680c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt @@ -7,9 +7,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project import com.intellij.openapi.util.ModificationTracker -import kotlinx.collections.immutable.PersistentMap -import kotlinx.collections.immutable.persistentMapOf -import kotlinx.collections.immutable.toPersistentMap import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirGlobalResolveComponents import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirBuiltinsSessionFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySessionFactory @@ -113,7 +110,7 @@ class LLFirSessionProviderStorage(val project: Project) { private class LLFirSessionsCache { @Volatile - private var mappings: PersistentMap = persistentMapOf() + private var mappings: Map = emptyMap() val sessionInvalidator: LLFirSessionInvalidator = LLFirSessionInvalidator { session -> mappings[session.llFirModuleData.ktModule]?.invalidate() @@ -125,7 +122,7 @@ private class LLFirSessionsCache { action: (Map) -> Pair, R> ): Pair, R> { val (newMappings, result) = action(getSessions().mapValues { it.value }) - mappings = newMappings.mapValues { FirSessionWithModificationTracker(project, it.value) }.toPersistentMap() + mappings = newMappings.mapValues { FirSessionWithModificationTracker(project, it.value) } return newMappings to result }