Skip to content

Commit 5a73753

Browse files
committed
perf: reduce code splitter prepare allocations
1 parent c1e897a commit 5a73753

1 file changed

Lines changed: 42 additions & 22 deletions

File tree

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

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,25 @@ struct PreparedBlockConnectionGroupBuilder {
5858
}
5959

6060
fn finalize_prepared_connection_map(
61-
connections: Vec<PreparedBlockConnectionBuilder>,
61+
connections: impl IntoIterator<Item = PreparedBlockConnectionBuilder>,
62+
capacity: usize,
6263
) -> PreparedBlockConnectionMap {
63-
let mut groups = Vec::<PreparedBlockConnectionGroupBuilder>::new();
64-
let mut group_index_by_block = DependenciesBlockIdentifierMap::<IdentifierMap<usize>>::default();
64+
let mut groups = Vec::<PreparedBlockConnectionGroupBuilder>::with_capacity(capacity);
65+
let mut group_index_by_block = Vec::<(DependenciesBlockIdentifier, IdentifierMap<usize>)>::new();
6566
for connection in connections {
66-
let index_by_module = group_index_by_block.entry(connection.block).or_default();
67+
let index_by_module = if let Some((_, index_by_module)) = group_index_by_block
68+
.iter_mut()
69+
.find(|(block, _)| *block == connection.block)
70+
{
71+
index_by_module
72+
} else {
73+
group_index_by_block.push((connection.block, IdentifierMap::default()));
74+
&mut group_index_by_block
75+
.last_mut()
76+
.expect("should have block")
77+
.1
78+
};
79+
6780
if let Some(index) = index_by_module.get(&connection.module) {
6881
groups[*index].connections.push(connection.dependency);
6982
continue;
@@ -2317,10 +2330,10 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
23172330
.module_graph_module_by_identifier(module)
23182331
.map(|mgm| mgm.all_dependencies())
23192332
.unwrap_or_default();
2320-
let mut connection_map = Vec::new();
2333+
let dependency_count = all_dependencies.len();
23212334

23222335
let mut ordered_deps = Vec::new();
2323-
let mut unordered_deps = Vec::new();
2336+
let mut unordered_deps = Vec::with_capacity(dependency_count);
23242337
for dep_id in all_dependencies {
23252338
let Some(connection) = mg.connection_by_dependency_id(dep_id) else {
23262339
continue;
@@ -2348,23 +2361,30 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
23482361
}
23492362
ordered_deps.sort_by_key(|(source_order, _, _, _)| *source_order);
23502363

2351-
for (_, block, dependency, module) in ordered_deps {
2352-
connection_map.push(PreparedBlockConnectionBuilder {
2353-
block,
2354-
module,
2355-
dependency,
2356-
});
2357-
}
2358-
2359-
for (block, dependency, module) in unordered_deps {
2360-
connection_map.push(PreparedBlockConnectionBuilder {
2361-
block,
2362-
module,
2363-
dependency,
2364-
});
2365-
}
2364+
let connection_count = ordered_deps.len() + unordered_deps.len();
2365+
let ordered_deps = ordered_deps
2366+
.into_iter()
2367+
.map(
2368+
|(_, block, dependency, module)| PreparedBlockConnectionBuilder {
2369+
block,
2370+
module,
2371+
dependency,
2372+
},
2373+
);
2374+
let unordered_deps = unordered_deps
2375+
.into_iter()
2376+
.map(
2377+
|(block, dependency, module)| PreparedBlockConnectionBuilder {
2378+
block,
2379+
module,
2380+
dependency,
2381+
},
2382+
);
23662383

2367-
(*module, finalize_prepared_connection_map(connection_map))
2384+
(
2385+
*module,
2386+
finalize_prepared_connection_map(ordered_deps.chain(unordered_deps), connection_count),
2387+
)
23682388
})
23692389
.collect::<IdentifierMap<_>>();
23702390

0 commit comments

Comments
 (0)