diff options
author | 2015-08-21 18:31:23 +0000 | |
---|---|---|
committer | 2015-08-24 14:02:16 +0000 | |
commit | b45e262b081620f6b431451c90068718741a4d3e (patch) | |
tree | 987e5d3535f50d47b79eef96cf03764e3e63d750 /src | |
parent | 72e805be455bcb52c1f785f55978ec8c4d9296d7 (diff) |
Improve efficiency of reverse queries for Skyframe by memoizing getAllowedDeps calls on the same batch call
--
MOS_MIGRATED_REVID=101238126
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java | 45 |
1 files changed, 30 insertions, 15 deletions
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 f1485e556a..ef85d38c39 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 @@ -101,6 +101,15 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> { private static final Logger LOG = Logger.getLogger(SkyQueryEnvironment.class.getName()); + private static final Function<Target, Label> TARGET_LABEL_FUNCTION = + new Function<Target, Label>() { + + @Override + public Label apply(Target target) { + return target.getLabel(); + } + }; + public SkyQueryEnvironment(boolean keepGoing, boolean strictScope, int loadingPhaseThreads, Predicate<Label> labelFilter, EventHandler eventHandler, @@ -211,23 +220,29 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> { return result; } - private Collection<Target> filterReverseDeps(final Target target, - Collection<Target> rawReverseDeps) { - return Collections2.filter(rawReverseDeps, new Predicate<Target>() { - @Override - public boolean apply(Target parent) { - return !(parent instanceof Rule) - || getAllowedDeps((Rule) parent).contains(target.getLabel()); - } - }); - - } - @Override public Collection<Target> getReverseDeps(Iterable<Target> targets) { - Set<Target> result = new HashSet<>(); - for (Map.Entry<Target, Collection<Target>> entry : getRawReverseDeps(targets).entrySet()) { - result.addAll(filterReverseDeps(entry.getKey(), entry.getValue())); + Set<Target> result = CompactHashSet.create(); + Map<Target, Collection<Target>> rawReverseDeps = getRawReverseDeps(targets); + + CompactHashSet<Target> visited = CompactHashSet.create(); + + Set<Label> keys = CompactHashSet.create(Collections2.transform(rawReverseDeps.keySet(), + TARGET_LABEL_FUNCTION)); + for (Collection<Target> parentCollection : rawReverseDeps.values()) { + for (Target parent : parentCollection) { + if (visited.add(parent)) { + if (parent instanceof Rule) { + for (Label label : getAllowedDeps((Rule) parent)) { + if (keys.contains(label)) { + result.add(parent); + } + } + } else { + result.add(parent); + } + } + } } return result; } |