starlark eval: avoid ImmutableSortedMap, which is slow Instead, sort in toString. RELNOTES: N/A PiperOrigin-RevId: 339308485
diff --git a/src/main/java/net/starlark/java/eval/StarlarkSemantics.java b/src/main/java/net/starlark/java/eval/StarlarkSemantics.java index b070419..b83e24a 100644 --- a/src/main/java/net/starlark/java/eval/StarlarkSemantics.java +++ b/src/main/java/net/starlark/java/eval/StarlarkSemantics.java
@@ -16,9 +16,9 @@ package net.starlark.java.eval; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSortedMap; -import java.util.HashMap; +import com.google.common.collect.ImmutableMap; import java.util.Map; +import java.util.TreeMap; /** * A StarlarkSemantics is an immutable set of optional name/value pairs that affect the dynamic @@ -43,15 +43,15 @@ public final class StarlarkSemantics { /** Returns the empty semantics, in which every option has its default value. */ - public static final StarlarkSemantics DEFAULT = new StarlarkSemantics(ImmutableSortedMap.of()); + public static final StarlarkSemantics DEFAULT = new StarlarkSemantics(ImmutableMap.of()); // A map entry must be accessed by Key iff its name has no [+-] prefix. // Key<Boolean> is permitted too. - // We use ImmutableSortedMap for the benefit of equals/hashCode/toString. - private final ImmutableSortedMap<String, Object> map; + // The map keys are sorted but we avoid ImmutableSortedMap due to observed inefficiency. + private final ImmutableMap<String, Object> map; private final int hashCode; - private StarlarkSemantics(ImmutableSortedMap<String, Object> map) { + private StarlarkSemantics(ImmutableMap<String, Object> map) { this.map = map; this.hashCode = map.hashCode(); } @@ -98,19 +98,19 @@ * Returns a new builder that initially holds the same key/value pairs as this StarlarkSemantics. */ public Builder toBuilder() { - return new Builder(new HashMap<>(map)); + return new Builder(new TreeMap<>(map)); } /** Returns a new empty builder. */ public static Builder builder() { - return new Builder(new HashMap<>()); + return new Builder(new TreeMap<>()); } /** A Builder is a mutable container used to construct an immutable StarlarkSemantics. */ public static final class Builder { - private final HashMap<String, Object> map; + private final TreeMap<String, Object> map; - private Builder(HashMap<String, Object> map) { + private Builder(TreeMap<String, Object> map) { this.map = map; } @@ -139,7 +139,7 @@ /** Returns an immutable StarlarkSemantics. */ public StarlarkSemantics build() { - return new StarlarkSemantics(ImmutableSortedMap.copyOf(map)); + return new StarlarkSemantics(ImmutableMap.copyOf(map)); } }