diff options
author | edef <edef@edef.eu> | 2024-10-19T13·58+0000 |
---|---|---|
committer | edef <edef@edef.eu> | 2024-10-19T17·01+0000 |
commit | 201d8f0cf2dd3b959bde91012c62ea5d3d714820 (patch) | |
tree | 3584459985d9268bf9ddf020919683efadb9a9df /users/edef/weave/src/main.rs | |
parent | 06d2536eec88bfcfd2388e3ca153ba99815b7e97 (diff) |
feat(users/edef/weave): use FxHashSet and dedupe early r/8846
Deduping early saves a fair bit of memory, but the extra hashing is costly. We switch to FxHash, since we don't need a DoS-proof hash, but we do need it to be *fast*. Change-Id: Ic6b7010874c417862baa9b882593208c8dd1d5e6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12648 Reviewed-by: flokli <flokli@flokli.de> Tested-by: BuildkiteCI
Diffstat (limited to 'users/edef/weave/src/main.rs')
-rw-r--r-- | users/edef/weave/src/main.rs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/users/edef/weave/src/main.rs b/users/edef/weave/src/main.rs index c86725003275..b86992c279d1 100644 --- a/users/edef/weave/src/main.rs +++ b/users/edef/weave/src/main.rs @@ -8,8 +8,9 @@ use anyhow::Result; use hashbrown::{hash_table, HashTable}; use rayon::prelude::*; +use rustc_hash::FxHashSet; use std::{ - collections::{BTreeMap, HashSet}, + collections::BTreeMap, fs::File, ops::Index, sync::atomic::{AtomicU32, Ordering}, @@ -54,7 +55,8 @@ fn main() -> Result<()> { eprintln!("{DONE}"); } - let mut todo = HashSet::with_capacity(roots.len()); + let mut todo = FxHashSet::default(); + todo.reserve(roots.len()); { let mut unknown_roots = 0usize; for (_, idx) in roots.table { @@ -99,14 +101,14 @@ fn main() -> Result<()> { .par_iter() .flat_map(|&parent| { if parent == INDEX_NULL { - return vec![]; + return FxHashSet::default(); } ri_array[parent as usize] .iter() .cloned() .filter(|child| !seen.contains(child)) - .collect::<Vec<u32>>() + .collect::<FxHashSet<u32>>() }) .collect(); |