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.
This commit is contained in:
commit
4b8f431995
@ -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 @@ fn default() -> Self {
|
||||
}
|
||||
}
|
||||
|
||||
#[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 @@ pub fn add(&mut self, a: T, b: 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
|
||||
|
Loading…
Reference in New Issue
Block a user