[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
This commit is contained in:
Ilya Kirillov
2023-02-17 12:57:42 +01:00
committed by Space Team
parent e5b4cf9f04
commit 6eda2742ff
@@ -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<KtModule, FirSessionWithModificationTracker> = persistentMapOf()
private var mappings: Map<KtModule, FirSessionWithModificationTracker> = emptyMap()
val sessionInvalidator: LLFirSessionInvalidator = LLFirSessionInvalidator { session ->
mappings[session.llFirModuleData.ktModule]?.invalidate()
@@ -125,7 +122,7 @@ private class LLFirSessionsCache {
action: (Map<KtModule, LLFirSession>) -> Pair<Map<KtModule, LLFirSession>, R>
): Pair<Map<KtModule, LLFirSession>, 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
}