Skip to content

Commit

Permalink
Auto merge of #103214 - Nilstrieb:set-theory, r=petrochenkov
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bors committed Oct 19, 2022
2 parents d7dd01f + d45f025 commit 4b8f431
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions compiler/rustc_data_structures/src/transitive_relation.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)]
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 4b8f431

Please sign in to comment.