Skip iteration in visitLabels if the contained type does not need to visit labels.
This only accounts for ~0.1% analysis cpu on a typical build, but it was easy enough to just add this handling.
RELNOTES: None.
PiperOrigin-RevId: 318866993
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java
index 778019c..f240876 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Type.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java
@@ -35,6 +35,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.RandomAccess;
import java.util.Set;
import java.util.logging.Level;
import javax.annotation.Nullable;
@@ -467,9 +468,11 @@
@Override
public <T> void visitLabels(LabelVisitor<T> visitor, Object value, T context) {
- for (Map.Entry<KeyT, ValueT> entry : cast(value).entrySet()) {
- keyType.visitLabels(visitor, entry.getKey(), context);
- valueType.visitLabels(visitor, entry.getValue(), context);
+ if (labelClass != LabelClass.NONE) {
+ for (Map.Entry<KeyT, ValueT> entry : cast(value).entrySet()) {
+ keyType.visitLabels(visitor, entry.getKey(), context);
+ valueType.visitLabels(visitor, entry.getValue(), context);
+ }
}
}
@@ -585,9 +588,13 @@
@Override
public <T> void visitLabels(LabelVisitor<T> visitor, Object value, T context) {
+ if (elemType.getLabelClass() == LabelClass.NONE) {
+ return;
+ }
+
List<ElemT> elems = cast(value);
// Hot code path. Optimize for lists with O(1) access to avoid iterator garbage.
- if (elems instanceof ImmutableList || elems instanceof ArrayList) {
+ if (elems instanceof RandomAccess) {
for (int i = 0; i < elems.size(); i++) {
elemType.visitLabels(visitor, elems.get(i), context);
}