Skip to content

Commit 8107e98

Browse files
authoredJul 23, 2024··
perf(es/helpers): Use bool instead of AtomicBool (#9321)
**Related issue:** - Closes #9222
1 parent 279ea91 commit 8107e98

File tree

6 files changed

+84
-26
lines changed

6 files changed

+84
-26
lines changed
 

‎.changeset/cold-pillows-walk.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_bundler: patch
3+
swc_ecma_transforms_base: patch
4+
---
5+
6+
perf(es/helpers): Use `bool` instead of `AtomicBool`

‎crates/swc_bundler/src/bundler/chunk/merge.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use swc_common::{
99
FileName, SyntaxContext, DUMMY_SP,
1010
};
1111
use swc_ecma_ast::*;
12+
use swc_ecma_transforms_base::helpers::Helpers;
1213
use swc_ecma_utils::{find_pat_ids, prepend_stmt, private_ident, quote_ident, ExprFactory};
1314
use swc_ecma_visit::{VisitMut, VisitMutWith};
1415
use EdgeDirection::Outgoing;
@@ -104,7 +105,18 @@ where
104105
let deps = all_deps_of_entry.iter().map(|id| {
105106
let dep_info = self.scope.get_module(*id).unwrap();
106107
entry_info.helpers.extend(&dep_info.helpers);
107-
entry_info.swc_helpers.extend_from(&dep_info.swc_helpers);
108+
109+
{
110+
let helpers = *entry_info.swc_helpers.lock();
111+
let dep_helpers = *dep_info.swc_helpers.lock();
112+
113+
let helpers = Helpers::from_data(helpers);
114+
let dep_helpers = Helpers::from_data(dep_helpers);
115+
116+
helpers.extend_from(&dep_helpers);
117+
118+
*entry_info.swc_helpers.lock() = helpers.data();
119+
}
108120

109121
if *id == entry_id {
110122
return Modules::empty(injected_ctxt);

‎crates/swc_bundler/src/bundler/finalize.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use swc_common::{collections::AHashMap, util::move_map::MoveMap, FileName, Mark,
66
use swc_ecma_ast::*;
77
use swc_ecma_transforms_base::{
88
fixer::fixer,
9-
helpers::{inject_helpers, HELPERS},
9+
helpers::{inject_helpers, Helpers, HELPERS},
1010
hygiene::hygiene,
1111
};
1212
use swc_ecma_utils::{contains_top_level_await, find_pat_ids, private_ident, ExprFactory};
@@ -48,15 +48,16 @@ where
4848

4949
{
5050
// Inject swc helpers
51-
let swc_helpers = self
51+
let swc_helpers = *self
5252
.scope
5353
.get_module(bundle.id)
5454
.expect("module should exist at this point")
55-
.swc_helpers;
55+
.swc_helpers
56+
.lock();
5657

5758
let module = bundle.module;
5859

59-
bundle.module = HELPERS.set(&swc_helpers, || {
60+
bundle.module = HELPERS.set(&Helpers::from_data(swc_helpers), || {
6061
module.fold_with(&mut inject_helpers(unresolved_mark))
6162
});
6263
}

‎crates/swc_bundler/src/bundler/load.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use anyhow::{Context, Error};
44
use is_macro::Is;
55
#[cfg(feature = "rayon")]
66
use rayon::iter::ParallelIterator;
7-
use swc_common::{sync::Lrc, FileName, SourceFile, SyntaxContext};
7+
use swc_common::{
8+
sync::{Lock, Lrc},
9+
FileName, SourceFile, SyntaxContext,
10+
};
811
use swc_ecma_ast::{
912
CallExpr, Callee, Expr, Ident, ImportDecl, ImportSpecifier, MemberExpr, MemberProp, Module,
1013
ModuleDecl, ModuleExportName, Str, SuperProp, SuperPropExpr,
@@ -38,7 +41,7 @@ pub(crate) struct TransformedModule {
3841
/// Used helpers
3942
pub helpers: Lrc<Helpers>,
4043

41-
pub swc_helpers: Lrc<swc_ecma_transforms_base::helpers::Helpers>,
44+
pub swc_helpers: Lrc<Lock<swc_ecma_transforms_base::helpers::HelperData>>,
4245

4346
local_ctxt: SyntaxContext,
4447
export_ctxt: SyntaxContext,
@@ -208,7 +211,7 @@ where
208211
exports: Lrc::new(exports),
209212
is_es6,
210213
helpers: Default::default(),
211-
swc_helpers: Lrc::new(data.helpers),
214+
swc_helpers: Lrc::new(Lock::new(data.helpers.data())),
212215
local_ctxt: SyntaxContext::empty().apply_mark(local_mark),
213216
export_ctxt: SyntaxContext::empty().apply_mark(export_mark),
214217
},

‎crates/swc_ecma_transforms_base/src/helpers/mod.rs

+42-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use std::{
2-
mem::replace,
3-
sync::atomic::{AtomicBool, Ordering},
4-
};
1+
use std::{cell::RefCell, mem::replace};
52

63
use once_cell::sync::Lazy;
74
use rustc_hash::FxHashMap;
@@ -52,7 +49,7 @@ macro_rules! add_to {
5249
parse(&code)
5350
});
5451

55-
let enable = $b.load(Ordering::Relaxed);
52+
let enable = $b;
5653
if enable {
5754
$buf.extend(STMTS.iter().cloned().map(|mut stmt| {
5855
stmt.visit_mut_with(&mut Marker {
@@ -69,7 +66,7 @@ macro_rules! add_to {
6966

7067
macro_rules! add_import_to {
7168
($buf:expr, $name:ident, $b:expr, $mark:expr) => {{
72-
let enable = $b.load(Ordering::Relaxed);
69+
let enable = $b;
7370
if enable {
7471
let ctxt = SyntaxContext::empty().apply_mark($mark);
7572
let s = ImportSpecifier::Named(ImportNamedSpecifier {
@@ -103,6 +100,13 @@ better_scoped_tls::scoped_tls!(
103100
/// Tracks used helper methods. (e.g. __extends)
104101
#[derive(Debug, Default)]
105102
pub struct Helpers {
103+
external: bool,
104+
mark: HelperMark,
105+
inner: RefCell<Inner>,
106+
}
107+
108+
#[derive(Debug, Clone, Copy)]
109+
pub struct HelperData {
106110
external: bool,
107111
mark: HelperMark,
108112
inner: Inner,
@@ -124,6 +128,22 @@ impl Helpers {
124128
pub const fn external(&self) -> bool {
125129
self.external
126130
}
131+
132+
pub fn data(&self) -> HelperData {
133+
HelperData {
134+
inner: *self.inner.borrow(),
135+
external: self.external,
136+
mark: self.mark,
137+
}
138+
}
139+
140+
pub fn from_data(data: HelperData) -> Self {
141+
Helpers {
142+
external: data.external,
143+
mark: data.mark,
144+
inner: RefCell::new(data.inner),
145+
}
146+
}
127147
}
128148

129149
#[derive(Debug, Clone, Copy)]
@@ -140,15 +160,15 @@ macro_rules! define_helpers {
140160
$( $name:ident : ( $( $dep:ident ),* ), )*
141161
}
142162
) => {
143-
#[derive(Debug,Default)]
163+
#[derive(Debug,Default, Clone, Copy)]
144164
struct Inner {
145-
$( $name: AtomicBool, )*
165+
$( $name: bool, )*
146166
}
147167

148168
impl Helpers {
149169
$(
150170
pub fn $name(&self) {
151-
self.inner.$name.store(true, Ordering::Relaxed);
171+
self.inner.borrow_mut().$name = true;
152172

153173
if !self.external {
154174
$(
@@ -159,11 +179,14 @@ macro_rules! define_helpers {
159179
)*
160180
}
161181

182+
162183
impl Helpers {
163184
pub fn extend_from(&self, other: &Self) {
185+
let other = other.inner.borrow();
186+
let mut me = self.inner.borrow_mut();
164187
$(
165-
if other.inner.$name.load(Ordering::SeqCst) {
166-
self.inner.$name.store(true, Ordering::Relaxed);
188+
if other.$name {
189+
me.$name = true;
167190
}
168191
)*
169192
}
@@ -173,8 +196,9 @@ macro_rules! define_helpers {
173196
fn is_helper_used(&self) -> bool{
174197

175198
HELPERS.with(|helpers|{
199+
let inner = helpers.inner.borrow();
176200
false $(
177-
|| helpers.inner.$name.load(Ordering::Relaxed)
201+
|| inner.$name
178202
)*
179203
})
180204
}
@@ -184,8 +208,9 @@ macro_rules! define_helpers {
184208

185209
HELPERS.with(|helpers|{
186210
debug_assert!(!helpers.external);
211+
let inner = helpers.inner.borrow();
187212
$(
188-
add_to!(buf, $name, helpers.inner.$name, helpers.mark.0);
213+
add_to!(buf, $name, inner.$name, helpers.mark.0);
189214
)*
190215
});
191216

@@ -196,9 +221,10 @@ macro_rules! define_helpers {
196221
let mut buf = Vec::new();
197222

198223
HELPERS.with(|helpers|{
224+
let inner = helpers.inner.borrow();
199225
debug_assert!(helpers.external);
200226
$(
201-
add_import_to!(buf, $name, helpers.inner.$name, helpers.mark.0);
227+
add_import_to!(buf, $name, inner.$name, helpers.mark.0);
202228
)*
203229
});
204230

@@ -209,8 +235,9 @@ macro_rules! define_helpers {
209235
let mut buf = Vec::new();
210236
HELPERS.with(|helpers|{
211237
debug_assert!(helpers.external);
238+
let inner = helpers.inner.borrow();
212239
$(
213-
let enable = helpers.inner.$name.load(Ordering::Relaxed);
240+
let enable = inner.$name;
214241
if enable {
215242
buf.push(self.build_reqire(stringify!($name), helpers.mark.0))
216243
}

‎crates/swc_ecma_transforms_base/src/perf.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use swc_ecma_ast::*;
55
pub use swc_ecma_utils::parallel::*;
66
use swc_ecma_visit::{Fold, FoldWith, Visit, VisitMut, VisitMutWith, VisitWith};
77

8+
use crate::helpers::Helpers;
89
#[cfg(feature = "concurrent")]
910
use crate::helpers::HELPERS;
1011

@@ -52,14 +53,18 @@ where
5253
if nodes.len() >= threshold {
5354
GLOBALS.with(|globals| {
5455
HELPERS.with(|helpers| {
56+
let helpers = helpers.data();
57+
5558
HANDLER.with(|handler| {
5659
use rayon::prelude::*;
5760

5861
let visitor = nodes
5962
.into_par_iter()
6063
.map(|node| {
64+
let helpers = Helpers::from_data(helpers);
65+
6166
GLOBALS.set(globals, || {
62-
HELPERS.set(helpers, || {
67+
HELPERS.set(&helpers, || {
6368
HANDLER.set(handler, || {
6469
let mut visitor = Parallel::create(&*self);
6570
node.visit_with(&mut visitor);
@@ -110,14 +115,16 @@ where
110115
if nodes.len() >= threshold {
111116
GLOBALS.with(|globals| {
112117
HELPERS.with(|helpers| {
118+
let helpers = helpers.data();
113119
HANDLER.with(|handler| {
114120
use rayon::prelude::*;
115121

116122
let visitor = nodes
117123
.into_par_iter()
118124
.map(|node| {
125+
let helpers = Helpers::from_data(helpers);
119126
GLOBALS.set(globals, || {
120-
HELPERS.set(helpers, || {
127+
HELPERS.set(&helpers, || {
121128
HANDLER.set(handler, || {
122129
let mut visitor = Parallel::create(&*self);
123130
node.visit_mut_with(&mut visitor);
@@ -170,12 +177,14 @@ where
170177

171178
let (visitor, nodes) = GLOBALS.with(|globals| {
172179
HELPERS.with(|helpers| {
180+
let helpers = helpers.data();
173181
HANDLER.with(|handler| {
174182
nodes
175183
.into_par_iter()
176184
.map(|node| {
185+
let helpers = Helpers::from_data(helpers);
177186
GLOBALS.set(globals, || {
178-
HELPERS.set(helpers, || {
187+
HELPERS.set(&helpers, || {
179188
HANDLER.set(handler, || {
180189
let mut visitor = Parallel::create(&*self);
181190
let node = node.fold_with(&mut visitor);

0 commit comments

Comments
 (0)
Please sign in to comment.