Skip to content

Commit c26a11a

Browse files
authored
perf: avoid heap allocation for getting connections (#8625)
1 parent 1702843 commit c26a11a

File tree

10 files changed

+48
-67
lines changed

10 files changed

+48
-67
lines changed

crates/rspack_core/src/build_chunk_graph/code_splitter.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,17 +1567,13 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
15671567
map.insert(b.into(), Vec::new());
15681568
}
15691569

1570-
let sorted_connections = module_graph
1571-
.get_ordered_connections(&module)
1572-
.expect("should have module");
1573-
15741570
// keep the dependency order sorted by span
15751571
let mut connection_map: IndexMap<
15761572
(DependenciesBlockIdentifier, ModuleIdentifier),
15771573
Vec<DependencyId>,
15781574
> = IndexMap::default();
15791575

1580-
for dep_id in sorted_connections {
1576+
for dep_id in module_graph.get_ordered_all_dependencies(&module) {
15811577
let dep = module_graph
15821578
.dependency_by_id(dep_id)
15831579
.expect("should have dep");

crates/rspack_core/src/chunk_graph/chunk_graph_module.rs

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -268,29 +268,23 @@ impl ChunkGraph {
268268
.hash(&mut hasher);
269269
let strict = module.get_strict_esm_module();
270270
let mg = compilation.get_module_graph();
271-
let connections = mg
272-
.get_outgoing_connections(&module.identifier())
273-
.into_iter()
274-
.collect::<Vec<_>>();
275-
if !connections.is_empty() {
276-
let mut visited_modules = IdentifierSet::default();
277-
visited_modules.insert(module.identifier());
278-
for connection in connections {
279-
let module_identifier = connection.module_identifier();
280-
if visited_modules.contains(module_identifier) {
281-
continue;
282-
}
283-
if connection.active_state(&mg, runtime).is_false() {
284-
continue;
285-
}
286-
visited_modules.insert(*module_identifier);
287-
let module = mg
288-
.module_by_identifier(module_identifier)
289-
.expect("should have module")
290-
.as_ref();
291-
module.get_exports_type(&mg, strict).hash(&mut hasher);
292-
self.get_module_graph_hash_without_connections(module, compilation, runtime);
271+
let mut visited_modules = IdentifierSet::default();
272+
visited_modules.insert(module.identifier());
273+
for connection in mg.get_outgoing_connections(&module.identifier()) {
274+
let module_identifier = connection.module_identifier();
275+
if visited_modules.contains(module_identifier) {
276+
continue;
293277
}
278+
if connection.active_state(&mg, runtime).is_false() {
279+
continue;
280+
}
281+
visited_modules.insert(*module_identifier);
282+
let module = mg
283+
.module_by_identifier(module_identifier)
284+
.expect("should have module")
285+
.as_ref();
286+
module.get_exports_type(&mg, strict).hash(&mut hasher);
287+
self.get_module_graph_hash_without_connections(module, compilation, runtime);
294288
}
295289
hasher.finish()
296290
}

crates/rspack_core/src/compiler/make/cutout/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ impl Cutout {
8686
res.extend(
8787
module_graph
8888
.get_incoming_connections(&module.identifier())
89-
.iter()
9089
.filter_map(|connect| connect.original_module_identifier),
9190
)
9291
}

crates/rspack_core/src/concatenated_module.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ impl ConcatenationEntryExternal {
154154
}
155155

156156
#[derive(Debug)]
157-
pub struct ConcatenatedModuleImportInfo {
158-
connection: ModuleGraphConnection,
157+
pub struct ConcatenatedModuleImportInfo<'a> {
158+
connection: &'a ModuleGraphConnection,
159159
source_order: i32,
160160
range_start: Option<u32>,
161161
}
@@ -201,8 +201,8 @@ pub struct ExternalModuleInfo {
201201
pub name: Option<Atom>,
202202
}
203203

204-
pub struct ConnectionWithRuntimeCondition {
205-
pub connection: ModuleGraphConnection,
204+
pub struct ConnectionWithRuntimeCondition<'a> {
205+
pub connection: &'a ModuleGraphConnection,
206206
pub runtime_condition: RuntimeCondition,
207207
}
208208

@@ -1530,7 +1530,7 @@ impl ConcatenatedModule {
15301530
module_set: &mut IdentifierIndexSet,
15311531
runtime: Option<&RuntimeSpec>,
15321532
mg: &ModuleGraph,
1533-
con: ModuleGraphConnection,
1533+
con: &ModuleGraphConnection,
15341534
runtime_condition: RuntimeCondition,
15351535
exists_entry: &mut IdentifierMap<RuntimeCondition>,
15361536
list: &mut Vec<ConcatenationEntry>,
@@ -1592,21 +1592,17 @@ impl ConcatenatedModule {
15921592
}
15931593
}
15941594

1595-
fn get_concatenated_imports(
1595+
fn get_concatenated_imports<'a>(
15961596
&self,
15971597
module_id: &ModuleIdentifier,
15981598
root_module_id: &ModuleIdentifier,
15991599
runtime: Option<&RuntimeSpec>,
1600-
mg: &ModuleGraph,
1601-
) -> Vec<ConnectionWithRuntimeCondition> {
1602-
let mut connections = mg
1603-
.get_outgoing_connections(module_id)
1604-
.into_iter()
1605-
.cloned()
1606-
.collect::<Vec<_>>();
1600+
mg: &'a ModuleGraph,
1601+
) -> Vec<ConnectionWithRuntimeCondition<'a>> {
1602+
let mut connections = mg.get_outgoing_connections(module_id).collect::<Vec<_>>();
16071603
if module_id == root_module_id {
16081604
for c in mg.get_outgoing_connections(&self.id) {
1609-
connections.push(c.clone());
1605+
connections.push(c);
16101606
}
16111607
}
16121608

crates/rspack_core/src/incremental/mutations.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ impl Mutations {
158158
updated_modules.extend(
159159
module_graph
160160
.get_incoming_connections(module)
161-
.into_iter()
162161
.filter_map(|c| c.original_module_identifier),
163162
);
164163
}

crates/rspack_core/src/module_graph/mod.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::hash_map::Entry;
33
use rspack_collections::{IdentifierMap, UkeyMap};
44
use rspack_error::Result;
55
use rspack_hash::RspackHashDigest;
6-
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
6+
use rustc_hash::FxHashMap as HashMap;
77
use swc_core::ecma::atoms::Atom;
88

99
use crate::{
@@ -789,18 +789,19 @@ impl<'a> ModuleGraph<'a> {
789789
exports_info.get_export_info(self, export_name)
790790
}
791791

792-
pub(crate) fn get_ordered_connections(
792+
pub(crate) fn get_ordered_all_dependencies(
793793
&self,
794794
module_identifier: &ModuleIdentifier,
795-
) -> Option<Vec<&DependencyId>> {
795+
) -> impl Iterator<Item = &DependencyId> {
796796
self
797797
.module_graph_module_by_identifier(module_identifier)
798798
.map(|m| {
799799
m.all_dependencies
800800
.iter()
801801
.filter(|dep_id| self.connection_by_dependency_id(dep_id).is_some())
802-
.collect()
803802
})
803+
.into_iter()
804+
.flatten()
804805
}
805806

806807
pub fn connection_by_dependency_id(
@@ -848,7 +849,7 @@ impl<'a> ModuleGraph<'a> {
848849

849850
pub fn is_optional(&self, module_id: &ModuleIdentifier) -> bool {
850851
let mut has_connections = false;
851-
for connection in self.get_incoming_connections(module_id).iter() {
852+
for connection in self.get_incoming_connections(module_id) {
852853
let Some(dependency) = self
853854
.dependency_by_id(&connection.dependency_id)
854855
.and_then(|dep| dep.as_module_dependency())
@@ -886,33 +887,33 @@ impl<'a> ModuleGraph<'a> {
886887
pub fn get_outgoing_connections(
887888
&self,
888889
module_id: &ModuleIdentifier,
889-
) -> HashSet<&ModuleGraphConnection> {
890+
) -> impl Iterator<Item = &ModuleGraphConnection> + Clone {
890891
self
891892
.module_graph_module_by_identifier(module_id)
892893
.map(|mgm| {
893894
mgm
894895
.outgoing_connections()
895896
.iter()
896897
.filter_map(|id| self.connection_by_dependency_id(id))
897-
.collect()
898898
})
899-
.unwrap_or_default()
899+
.into_iter()
900+
.flatten()
900901
}
901902

902903
pub fn get_incoming_connections(
903904
&self,
904905
module_id: &ModuleIdentifier,
905-
) -> HashSet<&ModuleGraphConnection> {
906+
) -> impl Iterator<Item = &ModuleGraphConnection> + Clone {
906907
self
907908
.module_graph_module_by_identifier(module_id)
908909
.map(|mgm| {
909910
mgm
910911
.incoming_connections()
911912
.iter()
912913
.filter_map(|id| self.connection_by_dependency_id(id))
913-
.collect()
914914
})
915-
.unwrap_or_default()
915+
.into_iter()
916+
.flatten()
916917
}
917918

918919
pub fn get_module_hash(&self, module_id: &ModuleIdentifier) -> Option<&RspackHashDigest> {

crates/rspack_plugin_dll/src/lib_manifest_plugin.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ async fn emit(&self, compilation: &mut Compilation) -> Result<()> {
111111
for module in chunk_graph.get_ordered_chunk_modules(&chunk.ukey(), &module_graph) {
112112
if self.options.entry_only.unwrap_or_default()
113113
&& !some_in_iterable(
114-
module_graph
115-
.get_incoming_connections(&module.identifier())
116-
.into_iter(),
114+
module_graph.get_incoming_connections(&module.identifier()),
117115
|conn| {
118116
let dep = module_graph.dependency_by_id(&conn.dependency_id);
119117

crates/rspack_plugin_javascript/src/plugin/infer_async_modules_plugin.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ fn set_sync_modules(
106106
let module_graph = compilation.get_module_graph();
107107
if module_graph
108108
.get_outgoing_connections(&module)
109-
.iter()
110109
.filter_map(|con| module_graph.module_identifier_by_dependency_id(&con.dependency_id))
111110
.filter(|&out| &module != out)
112111
.any(|module| ModuleGraph::is_async(compilation, module))
@@ -124,7 +123,6 @@ fn set_sync_modules(
124123
let module_graph = compilation.get_module_graph();
125124
module_graph
126125
.get_incoming_connections(&module)
127-
.iter()
128126
.filter(|con| {
129127
module_graph
130128
.dependency_by_id(&con.dependency_id)
@@ -160,7 +158,6 @@ fn set_async_modules(
160158
let module_graph = compilation.get_module_graph();
161159
module_graph
162160
.get_incoming_connections(&module)
163-
.iter()
164161
.filter(|con| {
165162
module_graph
166163
.dependency_by_id(&con.dependency_id)

crates/rspack_plugin_library/src/modern_module_library_plugin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ async fn finish_modules(&self, compilation: &mut Compilation) -> Result<()> {
223223
let mut deps_to_replace = Vec::new();
224224
let module = mg.module_by_identifier(module_id).expect("should have mgm");
225225

226-
let connections = mg.get_outgoing_connections(module_id);
226+
let connections: HashSet<_> = mg.get_outgoing_connections(module_id).collect();
227227
let block_ids = module.get_blocks();
228228

229229
for block_id in block_ids {
@@ -290,7 +290,7 @@ async fn finish_modules(&self, compilation: &mut Compilation) -> Result<()> {
290290
let mut deps_to_replace = Vec::new();
291291
let mut external_connections = Vec::new();
292292
let module = mg.module_by_identifier(module_id).expect("should have mgm");
293-
let connections = mg.get_outgoing_connections(module_id);
293+
let connections: HashSet<_> = mg.get_outgoing_connections(module_id).collect();
294294
let dep_ids = module.get_dependencies();
295295

296296
let mut module_id_to_connections: IdentifierMap<Vec<DependencyId>> = IdentifierMap::default();

crates/rspack_plugin_warn_sensitive_module/src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,18 @@ impl WarnCaseSensitiveModulesPlugin {
2727

2828
for m in modules {
2929
if let Some(boxed_m) = graph.module_by_identifier(&m) {
30-
let mut module_msg = format!(" - {}\n", m);
30+
message.push_str(" - ");
31+
message.push_str(&m);
32+
message.push('\n');
3133
graph
3234
.get_incoming_connections(&boxed_m.identifier())
33-
.iter()
3435
.for_each(|c| {
3536
if let Some(original_identifier) = c.original_module_identifier {
36-
module_msg.push_str(&format!(" - used by {}\n", original_identifier));
37+
message.push_str(" - used by ");
38+
message.push_str(&original_identifier);
39+
message.push('\n');
3740
}
3841
});
39-
40-
message.push_str(&module_msg);
4142
}
4243
}
4344

0 commit comments

Comments
 (0)