Skip to content

Commit 4880b9e

Browse files
authored
perf: revert parallelize flag usage plugin (#10941)
1 parent cceb0ea commit 4880b9e

File tree

1 file changed

+70
-89
lines changed

1 file changed

+70
-89
lines changed

crates/rspack_plugin_javascript/src/plugin/flag_dependency_usage_plugin.rs

Lines changed: 70 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::collections::{hash_map::Entry, VecDeque};
22

3-
use rayon::prelude::*;
4-
use rspack_collections::{Identifier, IdentifierMap, UkeyMap};
3+
use rspack_collections::{IdentifierMap, UkeyMap};
54
use rspack_core::{
65
get_entry_runtime, incremental::IncrementalPasses, is_exports_object_referenced,
76
is_no_exports_referenced, AsyncDependenciesBlockIdentifier, BuildMetaExportsType, Compilation,
@@ -11,20 +10,14 @@ use rspack_core::{
1110
};
1211
use rspack_error::Result;
1312
use rspack_hook::{plugin, plugin_hook};
14-
use rspack_util::swc::join_atom;
13+
use rspack_util::{queue::Queue, swc::join_atom};
1514
use rustc_hash::FxHashMap as HashMap;
1615

1716
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
1817
enum ModuleOrAsyncDependenciesBlock {
1918
Module(ModuleIdentifier),
2019
AsyncDependenciesBlock(AsyncDependenciesBlockIdentifier),
2120
}
22-
23-
#[derive(Debug, Clone)]
24-
enum ProcessModuleReferencedExports {
25-
Map(HashMap<String, ExtendedReferencedExport>),
26-
ExtendRef(Vec<ExtendedReferencedExport>),
27-
}
2821
#[allow(unused)]
2922
pub struct FlagDependencyUsagePluginProxy<'a> {
3023
global: bool,
@@ -49,8 +42,7 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
4942
.exports_info_module_map
5043
.insert(mgm.exports, mgm.module_identifier);
5144
}
52-
let mut batch = Vec::new();
53-
45+
let mut q = Queue::new();
5446
let mg = &mut module_graph;
5547
for exports_info in self.exports_info_module_map.keys() {
5648
exports_info.set_has_use_info(mg);
@@ -69,65 +61,43 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
6961
global_runtime.get_or_insert_default().extend(runtime);
7062
}
7163
for &dep in entry.dependencies.iter() {
72-
self.process_entry_dependency(dep, runtime.clone(), &mut batch);
64+
self.process_entry_dependency(dep, runtime.clone(), &mut q);
7365
}
7466
for &dep in entry.include_dependencies.iter() {
75-
self.process_entry_dependency(dep, runtime.clone(), &mut batch);
67+
self.process_entry_dependency(dep, runtime.clone(), &mut q);
7668
}
7769
}
7870
for dep in self.compilation.global_entry.dependencies.clone() {
79-
self.process_entry_dependency(dep, global_runtime.clone(), &mut batch);
71+
self.process_entry_dependency(dep, global_runtime.clone(), &mut q);
8072
}
8173
for dep in self.compilation.global_entry.include_dependencies.clone() {
82-
self.process_entry_dependency(dep, global_runtime.clone(), &mut batch);
74+
self.process_entry_dependency(dep, global_runtime.clone(), &mut q);
8375
}
8476
self.compilation.entries = entries;
8577

86-
while !batch.is_empty() {
87-
let modules = std::mem::take(&mut batch);
88-
let module_graph = self.compilation.get_module_graph();
89-
let module_graph_cache = &self.compilation.module_graph_cache_artifact;
90-
let mut module_referenced_exports = modules
91-
.into_par_iter()
92-
.map(|(module_id, runtime)| {
93-
self.collect_module_referenced_exports(
94-
ModuleOrAsyncDependenciesBlock::Module(module_id),
95-
runtime,
96-
false,
97-
)
98-
})
99-
.collect::<Vec<_>>();
100-
101-
for referenced_exports in module_referenced_exports {
102-
for (module_id, referenced_exports, runtime, force_side_effects) in referenced_exports {
103-
let normalized_refs = match referenced_exports {
104-
ProcessModuleReferencedExports::Map(map) => map.into_values().collect::<Vec<_>>(),
105-
ProcessModuleReferencedExports::ExtendRef(extend_ref) => extend_ref,
106-
};
107-
self.process_referenced_module(
108-
module_id,
109-
normalized_refs,
110-
runtime.clone(),
111-
force_side_effects,
112-
&mut batch,
113-
);
114-
}
115-
}
78+
while let Some((module_id, runtime)) = q.dequeue() {
79+
self.process_module(
80+
ModuleOrAsyncDependenciesBlock::Module(module_id),
81+
runtime,
82+
false,
83+
&mut q,
84+
);
11685
}
11786
}
11887

119-
fn collect_module_referenced_exports(
120-
&self,
88+
fn process_module(
89+
&mut self,
12190
block_id: ModuleOrAsyncDependenciesBlock,
12291
runtime: Option<RuntimeSpec>,
12392
force_side_effects: bool,
124-
) -> Vec<(
125-
Identifier,
126-
ProcessModuleReferencedExports,
127-
Option<RuntimeSpec>,
128-
bool,
129-
)> {
130-
let mut res = Vec::new();
93+
q: &mut Queue<(ModuleIdentifier, Option<RuntimeSpec>)>,
94+
) {
95+
#[derive(Debug, Clone)]
96+
enum ProcessModuleReferencedExports {
97+
Map(HashMap<String, ExtendedReferencedExport>),
98+
ExtendRef(Vec<ExtendedReferencedExport>),
99+
}
100+
131101
let mut map: IdentifierMap<ProcessModuleReferencedExports> = IdentifierMap::default();
132102
let mut queue = VecDeque::new();
133103
queue.push_back(block_id);
@@ -157,11 +127,12 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
157127
&& let Some(GroupOptions::Entrypoint(options)) = block.get_group_options()
158128
{
159129
let runtime = RuntimeSpec::from_entry_options(options);
160-
res.extend(self.collect_module_referenced_exports(
130+
self.process_module(
161131
ModuleOrAsyncDependenciesBlock::AsyncDependenciesBlock(block_id),
162132
runtime,
163133
true,
164-
));
134+
q,
135+
)
165136
} else {
166137
queue.push_back(ModuleOrAsyncDependenciesBlock::AsyncDependenciesBlock(
167138
block_id,
@@ -186,11 +157,12 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
186157
continue;
187158
}
188159
ConnectionState::TransitiveOnly => {
189-
res.extend(self.collect_module_referenced_exports(
160+
self.process_module(
190161
ModuleOrAsyncDependenciesBlock::Module(*connection.module_identifier()),
191162
runtime.clone(),
192163
false,
193-
));
164+
q,
165+
);
194166
continue;
195167
}
196168
_ => {}
@@ -282,30 +254,33 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
282254
}
283255
}
284256

285-
res.extend(map.into_iter().map(|(module_id, referenced_exports)| {
286-
(
257+
for (module_id, referenced_exports) in map {
258+
let normalized_refs = match referenced_exports {
259+
ProcessModuleReferencedExports::Map(map) => map.into_values().collect::<Vec<_>>(),
260+
ProcessModuleReferencedExports::ExtendRef(extend_ref) => extend_ref,
261+
};
262+
self.process_referenced_module(
287263
module_id,
288-
referenced_exports,
264+
normalized_refs,
289265
runtime.clone(),
290266
force_side_effects,
291-
)
292-
}));
293-
294-
res
267+
q,
268+
);
269+
}
295270
}
296271

297272
fn process_entry_dependency(
298273
&mut self,
299274
dep: DependencyId,
300275
runtime: Option<RuntimeSpec>,
301-
batch: &mut Vec<(Identifier, Option<RuntimeSpec>)>,
276+
queue: &mut Queue<(ModuleIdentifier, Option<RuntimeSpec>)>,
302277
) {
303278
if let Some(module) = self
304279
.compilation
305280
.get_module_graph()
306281
.module_graph_module_by_dependency_id(&dep)
307282
{
308-
self.process_referenced_module(module.module_identifier, vec![], runtime, true, batch);
283+
self.process_referenced_module(module.module_identifier, vec![], runtime, true, queue);
309284
}
310285
}
311286

@@ -315,7 +290,7 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
315290
used_exports: Vec<ExtendedReferencedExport>,
316291
runtime: Option<RuntimeSpec>,
317292
force_side_effects: bool,
318-
batch: &mut Vec<(Identifier, Option<RuntimeSpec>)>,
293+
queue: &mut Queue<(ModuleIdentifier, Option<RuntimeSpec>)>,
319294
) {
320295
let mut module_graph = self.compilation.get_module_graph_mut();
321296
let mgm = module_graph
@@ -333,7 +308,7 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
333308
if need_insert {
334309
let flag = mgm_exports_info.set_used_without_info(&mut module_graph, runtime.as_ref());
335310
if flag {
336-
batch.push((module_id, None));
311+
queue.enqueue((module_id, None));
337312
}
338313
return;
339314
}
@@ -349,30 +324,34 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
349324
let flag = mgm_exports_info.set_used_in_unknown_way(&mut module_graph, runtime.as_ref());
350325

351326
if flag {
352-
batch.push((module_id, runtime.clone()));
327+
queue.enqueue((module_id, runtime.clone()));
353328
}
354329
} else {
355330
let mut current_exports_info = mgm_exports_info;
356331
let len = used_exports.len();
357332
for (i, used_export) in used_exports.into_iter().enumerate() {
358-
let export_info = current_exports_info
359-
.get_export_info(&mut module_graph, &used_export)
360-
.as_data_mut(&mut module_graph);
333+
let export_info = current_exports_info.get_export_info(&mut module_graph, &used_export);
361334
if !can_mangle {
362-
export_info.set_can_mangle_use(Some(false));
335+
export_info
336+
.as_data_mut(&mut module_graph)
337+
.set_can_mangle_use(Some(false));
363338
}
364339
if !can_inline {
365-
export_info.set_inlinable(Inlinable::NoByUse);
340+
export_info
341+
.as_data_mut(&mut module_graph)
342+
.set_inlinable(Inlinable::NoByUse);
366343
}
367344
let last_one = i == len - 1;
368345
if !last_one {
369-
let nested_info = export_info.exports_info();
346+
let nested_info = export_info.as_data(&module_graph).exports_info();
370347
if let Some(nested_info) = nested_info {
371-
let changed_flag = export_info.set_used_conditionally(
372-
Box::new(|used| used == &UsageState::Unused),
373-
UsageState::OnlyPropertiesUsed,
374-
runtime.as_ref(),
375-
);
348+
let changed_flag = export_info
349+
.as_data_mut(&mut module_graph)
350+
.set_used_conditionally(
351+
Box::new(|used| used == &UsageState::Unused),
352+
UsageState::OnlyPropertiesUsed,
353+
runtime.as_ref(),
354+
);
376355
if changed_flag {
377356
let current_module = if current_exports_info == mgm_exports_info {
378357
Some(module_id)
@@ -383,19 +362,21 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
383362
.cloned()
384363
};
385364
if let Some(current_module) = current_module {
386-
batch.push((current_module, runtime.clone()));
365+
queue.enqueue((current_module, runtime.clone()));
387366
}
388367
}
389368
current_exports_info = nested_info;
390369
continue;
391370
}
392371
}
393372

394-
let changed_flag = export_info.set_used_conditionally(
395-
Box::new(|v| v != &UsageState::Used),
396-
UsageState::Used,
397-
runtime.as_ref(),
398-
);
373+
let changed_flag = export_info
374+
.as_data_mut(&mut module_graph)
375+
.set_used_conditionally(
376+
Box::new(|v| v != &UsageState::Used),
377+
UsageState::Used,
378+
runtime.as_ref(),
379+
);
399380
if changed_flag {
400381
let current_module = if current_exports_info == mgm_exports_info {
401382
Some(module_id)
@@ -406,7 +387,7 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
406387
.cloned()
407388
};
408389
if let Some(current_module) = current_module {
409-
batch.push((current_module, runtime.clone()));
390+
queue.enqueue((current_module, runtime.clone()));
410391
}
411392
}
412393
break;
@@ -426,7 +407,7 @@ impl<'a> FlagDependencyUsagePluginProxy<'a> {
426407
.as_data_mut(&mut module_graph)
427408
.set_used_for_side_effects_only(runtime.as_ref());
428409
if changed_flag {
429-
batch.push((module_id, runtime));
410+
queue.enqueue((module_id, runtime));
430411
}
431412
}
432413
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy