From 4960a4d4c7cb7876ff2bfaae8a83c6dd4756ab72 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:50:34 +0000 Subject: [PATCH 1/3] perf(flow): optimize PathBuf clones in graph traversal Refactor `find_affected_files` to reduce memory allocations: - Remove redundant `visited` set (use `affected` set instead). - Use `VecDeque<&PathBuf>` to avoid cloning paths during queue processing. - Ensure only one `clone()` per unique affected node is performed. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- crates/flow/src/incremental/graph.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/flow/src/incremental/graph.rs b/crates/flow/src/incremental/graph.rs index 77a1c82..bc8c4ca 100644 --- a/crates/flow/src/incremental/graph.rs +++ b/crates/flow/src/incremental/graph.rs @@ -268,20 +268,17 @@ impl DependencyGraph { /// ``` pub fn find_affected_files(&self, changed_files: &RapidSet) -> RapidSet { let mut affected = thread_utilities::get_set(); - let mut visited = thread_utilities::get_set(); - let mut queue: VecDeque = changed_files.iter().cloned().collect(); + let mut queue: VecDeque<&PathBuf> = changed_files.iter().collect(); while let Some(file) = queue.pop_front() { - if !visited.insert(file.clone()) { + if !affected.insert(file.clone()) { continue; } - affected.insert(file.clone()); - // Follow reverse edges (files that depend on this file) - for edge in self.get_dependents(&file) { + for edge in self.get_dependents(file) { if edge.effective_strength() == DependencyStrength::Strong { - queue.push_back(edge.from.clone()); + queue.push_back(&edge.from); } } } From aaae4913f9640a1a301b1a4f636c33ea462ed037 Mon Sep 17 00:00:00 2001 From: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> Date: Thu, 26 Mar 2026 18:51:07 -0400 Subject: [PATCH 2/3] Update crates/flow/src/incremental/graph.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> --- crates/flow/src/incremental/graph.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/flow/src/incremental/graph.rs b/crates/flow/src/incremental/graph.rs index bc8c4ca..8defabb 100644 --- a/crates/flow/src/incremental/graph.rs +++ b/crates/flow/src/incremental/graph.rs @@ -271,9 +271,10 @@ impl DependencyGraph { let mut queue: VecDeque<&PathBuf> = changed_files.iter().collect(); while let Some(file) = queue.pop_front() { - if !affected.insert(file.clone()) { + if affected.contains(file) { continue; } + affected.insert(file.clone()); // Follow reverse edges (files that depend on this file) for edge in self.get_dependents(file) { From a91cd43dcad5e1537037186ebb57959b781a0934 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:08:52 +0000 Subject: [PATCH 3/3] perf(flow): skip enqueuing already-visited dependents to reduce queue churn Agent-Logs-Url: https://github.com/knitli/thread/sessions/92b7ba36-beb7-4460-8dfd-629b39468071 Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- crates/flow/src/incremental/graph.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/flow/src/incremental/graph.rs b/crates/flow/src/incremental/graph.rs index 8defabb..a93b839 100644 --- a/crates/flow/src/incremental/graph.rs +++ b/crates/flow/src/incremental/graph.rs @@ -278,7 +278,9 @@ impl DependencyGraph { // Follow reverse edges (files that depend on this file) for edge in self.get_dependents(file) { - if edge.effective_strength() == DependencyStrength::Strong { + if edge.effective_strength() == DependencyStrength::Strong + && !affected.contains(&edge.from) + { queue.push_back(&edge.from); } }