Properly size compact hash map in order to mitigate GC churn.
--
MOS_MIGRATED_REVID=129912633
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 586c493..40d8a89 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -87,7 +87,6 @@
import com.google.devtools.build.skyframe.SkyValue;
import com.google.devtools.build.skyframe.WalkableGraph;
import com.google.devtools.build.skyframe.WalkableGraph.WalkableGraphFactory;
-
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
@@ -106,7 +105,6 @@
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
-
import javax.annotation.Nullable;
/**
@@ -427,7 +425,8 @@
private Collection<Target> processRawReverseDeps(Map<Target, Collection<Target>> rawReverseDeps) {
Set<Target> result = CompactHashSet.create();
- CompactHashSet<Target> visited = CompactHashSet.create();
+ CompactHashSet<Target> visited =
+ CompactHashSet.createWithExpectedSize(totalSizeOfCollections(rawReverseDeps.values()));
Set<Label> keys = CompactHashSet.create(Collections2.transform(rawReverseDeps.keySet(),
TARGET_LABEL_FUNCTION));
@@ -449,6 +448,14 @@
return result;
}
+ private static <T> int totalSizeOfCollections(Iterable<Collection<T>> nestedCollections) {
+ int totalSize = 0;
+ for (Collection<T> collection : nestedCollections) {
+ totalSize += collection.size();
+ }
+ return totalSize;
+ }
+
@Override
public Set<Target> getTransitiveClosure(Set<Target> targets) {
Set<Target> visited = new HashSet<>();