From f404720b8fa0166a27f47bf6913307353def7fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sat, 11 Jan 2025 11:45:54 +0900 Subject: [PATCH] perf(es/renamer): Use `IndexSet` for rename queue (#9866) **Description:** `Vec::contains` was causing a time complexity issue for large input files. --- .changeset/tricky-glasses-call.md | 6 ++++++ .../src/rename/analyzer/scope.rs | 20 +++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 .changeset/tricky-glasses-call.md diff --git a/.changeset/tricky-glasses-call.md b/.changeset/tricky-glasses-call.md new file mode 100644 index 000000000000..11f53a18f0a0 --- /dev/null +++ b/.changeset/tricky-glasses-call.md @@ -0,0 +1,6 @@ +--- +swc_core: minor +swc_ecma_transforms_base: minor +--- + +perf(es/renamer): Use `IndexSet` for rename queue diff --git a/crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs b/crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs index 07c9122c91cb..3afff98aa2d4 100644 --- a/crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs +++ b/crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs @@ -2,12 +2,14 @@ use std::{ fmt::{Display, Formatter}, - mem::{transmute_copy, ManuallyDrop}, + hash::BuildHasherDefault, + mem::{take, transmute_copy, ManuallyDrop}, }; +use indexmap::IndexSet; #[cfg(feature = "concurrent-renamer")] use rayon::prelude::*; -use rustc_hash::FxHashSet; +use rustc_hash::{FxHashSet, FxHasher}; use swc_atoms::{atom, Atom}; use swc_common::{collections::AHashMap, util::take::Take, Mark, SyntaxContext}; use swc_ecma_ast::*; @@ -36,6 +38,8 @@ pub(crate) struct Scope { pub(super) children: Vec, } +pub(super) type FxIndexSet = IndexSet>; + #[derive(Debug, Default)] pub(super) struct ScopeData { /// All identifiers used by this scope or children. @@ -46,7 +50,7 @@ pub(super) struct ScopeData { /// because we merge every items in children to current scope. all: FxHashSet, - queue: Vec, + queue: FxIndexSet, } impl Scope { @@ -62,7 +66,7 @@ impl Scope { return; } - self.data.queue.push(id.clone()); + self.data.queue.insert(id.clone()); } } @@ -104,7 +108,7 @@ impl Scope { ) where R: Renamer, { - let queue = self.data.queue.take(); + let queue = take(&mut self.data.queue); // let mut cloned_reverse = reverse.clone(); @@ -136,7 +140,7 @@ impl Scope { to: &mut RenameMap, previous: &RenameMap, reverse: &mut ReverseMap, - queue: Vec, + queue: FxIndexSet, preserved: &FxHashSet, preserved_symbols: &FxHashSet, ) where @@ -208,7 +212,7 @@ impl Scope { ) where R: Renamer, { - let queue = self.data.queue.take(); + let queue = take(&mut self.data.queue); let mut cloned_reverse = reverse.next(); @@ -272,7 +276,7 @@ impl Scope { to: &mut RenameMap, previous: &RenameMap, reverse: &mut ReverseMap, - queue: Vec, + queue: FxIndexSet, preserved: &FxHashSet, preserved_symbols: &FxHashSet, ) where