diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2018-05-01 10:01:02 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2018-05-01 22:12:49 +1000 |
| commit | 94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0 (patch) | |
| tree | ddc4d00ad6599bca77e7b36e304749b71ae1e79f | |
| parent | f76f6fbdea497c3cb536e33387f405cc74b99b76 (diff) | |
| download | rust-94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0.tar.gz rust-94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0.zip | |
Use two vectors in nearest_common_ancestor.
When looking at any scope in scope chain A, we only need to look for matches among scopes previously seen in scope chain B, and vice versa. This halves the number of "seen before?" comparisons, speeding up some runs of style-servo, clap-rs, and syn by 1--2%.
| -rw-r--r-- | src/librustc/middle/region.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 5f4efbeeaa8..bfc9ff6660d 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -690,21 +690,22 @@ impl<'tcx> ScopeTree { // the start. So this algorithm is faster. let mut ma = Some(scope_a); let mut mb = Some(scope_b); - let mut seen: SmallVec<[Scope; 32]> = SmallVec::new(); + let mut seen_a: SmallVec<[Scope; 32]> = SmallVec::new(); + let mut seen_b: SmallVec<[Scope; 32]> = SmallVec::new(); loop { if let Some(a) = ma { - if seen.iter().position(|s| *s == a).is_some() { + if seen_b.iter().position(|s| *s == a).is_some() { return a; } - seen.push(a); + seen_a.push(a); ma = self.parent_map.get(&a).map(|s| *s); } if let Some(b) = mb { - if seen.iter().position(|s| *s == b).is_some() { + if seen_a.iter().position(|s| *s == b).is_some() { return b; } - seen.push(b); + seen_b.push(b); mb = self.parent_map.get(&b).map(|s| *s); } |
