From 3a8335d47fc8d8e7b85a0800ea65c90e60775d85 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 6 Aug 2018 16:08:24 +0700 Subject: [PATCH] Optimize memory footprint for SlicedMapImpl in case it's empty It might be useful in case of many delegating traces that remain effectively empty themselves (up to 7M of empty maps in case of compilation of 'idea' module) --- .../kotlin/util/slicedMap/SlicedMapImpl.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java index 1f52470d1d9..88b77db744c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Key; import com.intellij.util.keyFMap.KeyFMap; import kotlin.jvm.functions.Function3; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Collections; @@ -31,7 +32,8 @@ import java.util.Map; public class SlicedMapImpl implements MutableSlicedMap { private final boolean alwaysAllowRewrite; - private final Map map = new OpenAddressLinearProbingHashTable<>(); + @Nullable + private Map map = null; private Multimap, Object> collectiveSliceKeys = null; public SlicedMapImpl(boolean alwaysAllowRewrite) { @@ -44,6 +46,10 @@ public class SlicedMapImpl implements MutableSlicedMap { return; } + if (map == null) { + map = new OpenAddressLinearProbingHashTable<>(); + } + KeyFMap holder = map.get(key); if (holder == null) { holder = KeyFMap.EMPTY_MAP; @@ -76,13 +82,13 @@ public class SlicedMapImpl implements MutableSlicedMap { @Override public void clear() { - map.clear(); + map = null; collectiveSliceKeys = null; } @Override public V get(ReadOnlySlice slice, K key) { - KeyFMap holder = map.get(key); + KeyFMap holder = map != null ? map.get(key) : null; V value = holder == null ? null : holder.get(slice.getKey()); @@ -100,6 +106,7 @@ public class SlicedMapImpl implements MutableSlicedMap { @Override public void forEach(@NotNull Function3 f) { + if (map == null) return; map.forEach((key, holder) -> { if (holder == null) return; @@ -114,6 +121,8 @@ public class SlicedMapImpl implements MutableSlicedMap { @NotNull @Override public ImmutableMap getSliceContents(@NotNull ReadOnlySlice slice) { + if (map == null) return ImmutableMap.of(); + ImmutableMap.Builder builder = ImmutableMap.builder(); map.forEach((key, holder) -> {