Replace streaming with ImmutableList building.
This is supposed to avoid some amount of short-lived garbage.
Also avoid flattening the nested set if we don't care about the actual size.
RELNOTES: None
PiperOrigin-RevId: 292512877
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetView.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetView.java
index 96ec012..216817a 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetView.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetView.java
@@ -13,7 +13,6 @@
// limitations under the License.
package com.google.devtools.build.lib.collect.nestedset;
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
@@ -101,10 +100,13 @@
if (!(set instanceof Object[])) {
return ImmutableSet.of();
}
- return Arrays.stream((Object[]) set)
- .filter(c -> c instanceof Object[])
- .map(c -> new NestedSetView<E>(c))
- .collect(toImmutableSet());
+ ImmutableSet.Builder<NestedSetView<E>> nestedSetViewSetBuilder = new ImmutableSet.Builder<>();
+ for (Object c : (Object[]) set) {
+ if (c instanceof Object[]) {
+ nestedSetViewSetBuilder.add(new NestedSetView<>(c));
+ }
+ }
+ return nestedSetViewSetBuilder.build();
}
/**
@@ -118,9 +120,12 @@
if (!(set instanceof Object[])) {
return ImmutableSet.of((E) set);
}
- return Arrays.stream((Object[]) set)
- .filter(c -> !(c instanceof Object[]))
- .map(c -> (E) c)
- .collect(toImmutableSet());
+ ImmutableSet.Builder<E> setBuilder = new ImmutableSet.Builder<>();
+ for (Object c : (Object[]) set) {
+ if (!(c instanceof Object[])) {
+ setBuilder.add((E) c);
+ }
+ }
+ return setBuilder.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index 89ec541..a51d334 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -392,6 +392,10 @@
*/
private static boolean evalInputsAsNestedSet(
int nestedSetSizeThreshold, NestedSet<Artifact> inputs) {
+ if (nestedSetSizeThreshold == 1) {
+ // Don't even flatten in this case.
+ return true;
+ }
return nestedSetSizeThreshold > 0
&& (inputs.memoizedFlattenAndGetSize() >= nestedSetSizeThreshold);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactNestedSetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactNestedSetKey.java
index 9a57788..a716922 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactNestedSetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactNestedSetKey.java
@@ -15,14 +15,12 @@
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
-import java.util.Arrays;
import java.util.Collections;
-import java.util.stream.Collectors;
/** SkyKey for {@code NestedSet<Artifact>}. */
public class ArtifactNestedSetKey implements SkyKey {
@@ -88,11 +86,15 @@
*/
Iterable<Object> transitiveMembers() {
if (!(rawChildren instanceof Object[])) {
- return ImmutableSet.of();
+ return ImmutableList.of();
}
- return Arrays.stream((Object[]) rawChildren)
- .filter(c -> c instanceof Object[])
- .collect(Collectors.toList());
+ ImmutableList.Builder<Object> listBuilder = new ImmutableList.Builder<>();
+ for (Object c : (Object[]) rawChildren) {
+ if (c instanceof Object[]) {
+ listBuilder.add(c);
+ }
+ }
+ return listBuilder.build();
}
/**
@@ -107,9 +109,12 @@
if (!(rawChildren instanceof Object[])) {
return Collections.singletonList(Artifact.key((Artifact) rawChildren));
}
- return Arrays.stream((Object[]) rawChildren)
- .filter(c -> !(c instanceof Object[]))
- .map(c -> Artifact.key((Artifact) c))
- .collect(Collectors.toList());
+ ImmutableList.Builder<SkyKey> listBuilder = new ImmutableList.Builder<>();
+ for (Object c : (Object[]) rawChildren) {
+ if (!(c instanceof Object[])) {
+ listBuilder.add(Artifact.key((Artifact) c));
+ }
+ }
+ return listBuilder.build();
}
}