From 5f6a364433f193015984d004925702d8884876f2 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sun, 18 Feb 2024 15:17:34 +0800 Subject: [PATCH] Avoid `parent_url()` allocating a new `Url` to optimize the performance of `add_many` method --- yazi-core/src/tab/selected.rs | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/yazi-core/src/tab/selected.rs b/yazi-core/src/tab/selected.rs index 44ae0563..49308713 100644 --- a/yazi-core/src/tab/selected.rs +++ b/yazi-core/src/tab/selected.rs @@ -48,36 +48,31 @@ impl Selected { /// # Examples /// /// ``` - /// # - /// # use yazi_core::select::Select; - /// # use yazi_shared::fs::Url; - /// let mut selected= Select::default(); + /// let mut s = Selected::default(); + /// /// let url1 = Url::from("/a/b/c"); /// let url2 = Url::from("/a/b/d"); - /// let urls = vec![&url1, &url2]; - /// - /// assert!(selected.add_many(&urls)); + /// assert!(selected.add_many(&[&url1, &url2])); /// ``` pub fn add_many(&mut self, urls: &[&Url]) -> bool { if urls.is_empty() { return true; - } - - let mut parent = urls[0].parent_url(); - while let Some(u) = parent { - if self.inner.contains(&u) { - return false; - } - parent = u.parent_url(); - } - - if self.parents.contains_key(urls[0]) { + } else if self.parents.contains_key(urls[0]) { return false; } let mut parent = urls[0].parent_url(); + let mut parents = vec![]; while let Some(u) = parent { + if self.inner.contains(&u) { + return false; + } + parent = u.parent_url(); + parents.push(u); + } + + for u in parents { *self.parents.entry(u).or_insert(0) += urls.len(); }