Skip to content

Commit 00d375f

Browse files
committed
perf: streamline chunk group merging
1 parent e61e36d commit 00d375f

1 file changed

Lines changed: 45 additions & 43 deletions

File tree

crates/rspack_core/src/compilation/build_chunk_graph/code_splitter.rs

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2217,55 +2217,57 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
22172217
}
22182218

22192219
for batch in chunk_groups_merging_batches {
2220-
let chunk_groups_merging_tasks = batch
2221-
.into_iter()
2222-
.map(|(info_ukey, process_block)| {
2223-
let cgi = std::mem::take(self.chunk_group_info_mut(&info_ukey));
2224-
(info_ukey, process_block, cgi)
2225-
})
2226-
.collect::<Vec<_>>();
2220+
let mut chunk_groups_merging_tasks = Vec::with_capacity(batch.len());
2221+
for (info_ukey, process_block) in batch {
2222+
let cgi = std::mem::take(self.chunk_group_info_mut(&info_ukey));
2223+
chunk_groups_merging_tasks.push((info_ukey, process_block, cgi));
2224+
}
22272225

2228-
let (chunk_group_infos, chunk_group_merging_results): (Vec<_>, Vec<_>) =
2229-
chunk_groups_merging_tasks
2230-
.into_par_iter()
2231-
.map(|(info_ukey, process_block, mut cgi)| {
2232-
let mut changed = false;
2233-
let available_modules_length = cgi.available_modules_to_be_merged.len() as u32;
2234-
2235-
if !cgi.available_modules_to_be_merged.is_empty() {
2236-
let available_modules_to_be_merged =
2237-
std::mem::take(&mut cgi.available_modules_to_be_merged);
2238-
2239-
for modules_to_be_merged in available_modules_to_be_merged {
2240-
if !cgi.min_available_modules_init {
2241-
cgi.min_available_modules_init = true;
2242-
cgi.min_available_modules = modules_to_be_merged;
2243-
changed = true;
2244-
continue;
2245-
}
2246-
2247-
let orig = cgi.min_available_modules.clone();
2248-
cgi.min_available_modules =
2249-
Arc::new(cgi.min_available_modules.as_ref() & modules_to_be_merged.as_ref());
2250-
changed |= orig != cgi.min_available_modules;
2226+
let mut chunk_group_merging_results = chunk_groups_merging_tasks
2227+
.into_par_iter()
2228+
.map(|(info_ukey, process_block, mut cgi)| {
2229+
let mut changed = false;
2230+
let available_modules_length = cgi.available_modules_to_be_merged.len() as u32;
2231+
2232+
if !cgi.available_modules_to_be_merged.is_empty() {
2233+
let available_modules_to_be_merged =
2234+
std::mem::take(&mut cgi.available_modules_to_be_merged);
2235+
2236+
for modules_to_be_merged in available_modules_to_be_merged {
2237+
if !cgi.min_available_modules_init {
2238+
cgi.min_available_modules_init = true;
2239+
cgi.min_available_modules = modules_to_be_merged;
2240+
changed = true;
2241+
continue;
22512242
}
2252-
}
22532243

2254-
if changed {
2255-
cgi.invalidate_resulting_available_modules();
2244+
let merged = cgi.min_available_modules.as_ref() & modules_to_be_merged.as_ref();
2245+
if &merged != cgi.min_available_modules.as_ref() {
2246+
cgi.min_available_modules = Arc::new(merged);
2247+
changed = true;
2248+
}
22562249
}
2257-
(
2258-
(info_ukey, cgi),
2259-
(info_ukey, process_block, changed, available_modules_length),
2260-
)
2261-
})
2262-
.unzip();
2263-
2264-
for (info_ukey, cgi) in chunk_group_infos {
2265-
*self.chunk_group_info_mut(&info_ukey) = cgi;
2250+
}
2251+
2252+
if changed {
2253+
cgi.invalidate_resulting_available_modules();
2254+
}
2255+
2256+
(
2257+
info_ukey,
2258+
Some(cgi),
2259+
process_block,
2260+
changed,
2261+
available_modules_length,
2262+
)
2263+
})
2264+
.collect::<Vec<_>>();
2265+
2266+
for (info_ukey, cgi, _, _, _) in &mut chunk_group_merging_results {
2267+
*self.chunk_group_info_mut(info_ukey) = cgi.take().expect("should have chunk group info");
22662268
}
22672269

2268-
for (info_ukey, process_block, changed, available_modules_length) in
2270+
for (info_ukey, _, process_block, changed, available_modules_length) in
22692271
chunk_group_merging_results
22702272
{
22712273
self.stat_merged_available_module_sets += available_modules_length;

0 commit comments

Comments
 (0)