From 5f022aa8a9f16967fc76c10b541fcb061020061d Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 3 Nov 2026 23:00:54 -0500 Subject: [PATCH] perf(engine): index variables once when following a library's alias chains (#1968) * perf(engine): index variables once when following a library's alias chains * address review: return before indexing variables for an empty seed set --- crates/engine/src/assets/library.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/assets/library.rs b/crates/engine/src/assets/library.rs index 7e7e9b80d..01e8d3244 100644 --- a/crates/engine/src/assets/library.rs +++ b/crates/engine/src/assets/library.rs @@ -277,8 +277,16 @@ pub fn default_selection(doc: &Document, prev: Option<&LibraryManifest>) -> Sele fn alias_closure(vars: &Variables, seeds: impl IntoIterator) -> BTreeSet { let mut out = BTreeSet::new(); let mut stack: Vec = seeds.into_iter().collect(); + if stack.is_empty() { + return out; + } + // Indexed once (the first of equal ids, as `get_by_id` finds it): a scan per step is quadratic on a long alias chain. + let mut by_id = std::collections::HashMap::new(); + for v in &vars.variables { + by_id.entry(v.id.as_str()).or_insert(v); + } while let Some(cur) = stack.pop() { - let Some(v) = vars.get_by_id(&cur) else { continue }; + let Some(v) = by_id.get(cur.as_str()).copied() else { continue }; if out.len() >= MAX_ASSETS || !out.insert(v.id.clone()) { continue; }