diff options
| author | bors <bors@rust-lang.org> | 2022-10-19 13:53:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-10-19 13:53:06 +0000 |
| commit | 4b8f4319954ff2642690b9e5cbe4af352d095bf6 (patch) | |
| tree | e5b8d7bbaf6b66a33d4b54f2539115818efaa27c | |
| parent | d7dd01fe8b071602510eaac9f676acc0e3cf8e4a (diff) | |
| parent | d45f025c90c01b9ccea49e2036475ca09e581db1 (diff) | |
| download | rust-4b8f4319954ff2642690b9e5cbe4af352d095bf6.tar.gz rust-4b8f4319954ff2642690b9e5cbe4af352d095bf6.zip | |
Auto merge of #103214 - Nilstrieb:set-theory, r=petrochenkov
Use Set instead of Vec in transitive_relation Helps with #103195. It doesn't fix the underlying quadraticness but it makes it _a lot_ faster to an extent where even doubling the amount of nested references still takes less than two seconds (50s on nightly). I want to see whether this causes regressions (because the vec was usually quite small) or improvements (as lookup for bigger sets is now much faster) in real code.
| -rw-r--r-- | compiler/rustc_data_structures/src/transitive_relation.rs | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/compiler/rustc_data_structures/src/transitive_relation.rs b/compiler/rustc_data_structures/src/transitive_relation.rs index f016c391fe7..cf616203842 100644 --- a/compiler/rustc_data_structures/src/transitive_relation.rs +++ b/compiler/rustc_data_structures/src/transitive_relation.rs @@ -1,5 +1,5 @@ use crate::frozen::Frozen; -use crate::fx::FxIndexSet; +use crate::fx::{FxHashSet, FxIndexSet}; use rustc_index::bit_set::BitMatrix; use std::fmt::Debug; use std::hash::Hash; @@ -16,7 +16,7 @@ pub struct TransitiveRelationBuilder<T> { // List of base edges in the graph. Require to compute transitive // closure. - edges: Vec<Edge>, + edges: FxHashSet<Edge>, } #[derive(Debug)] @@ -52,10 +52,10 @@ impl<T: Eq + Hash> Default for TransitiveRelationBuilder<T> { } } -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug, Hash)] struct Index(usize); -#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(Clone, PartialEq, Eq, Debug, Hash)] struct Edge { source: Index, target: Index, @@ -99,9 +99,7 @@ impl<T: Eq + Hash + Copy> TransitiveRelationBuilder<T> { let a = self.add_index(a); let b = self.add_index(b); let edge = Edge { source: a, target: b }; - if !self.edges.contains(&edge) { - self.edges.push(edge); - } + self.edges.insert(edge); } /// Compute the transitive closure derived from the edges, and converted to |
