Skip to content

Commit 528c6e1

Browse files
authored
perf: parallelize getting source sizes in size limit plugin (#10910)
1 parent 94ece6f commit 528c6e1

File tree

3 files changed

+36
-22
lines changed

3 files changed

+36
-22
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rspack_plugin_size_limits/Cargo.toml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ version.workspace = true
88
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
99

1010
[dependencies]
11-
derive_more = { workspace = true, features = ["debug"] }
12-
futures = { workspace = true }
13-
rspack_core = { workspace = true }
14-
rspack_error = { workspace = true }
15-
rspack_hook = { workspace = true }
16-
rspack_util = { workspace = true }
17-
tracing = { workspace = true }
11+
derive_more = { workspace = true, features = ["debug"] }
12+
futures = { workspace = true }
13+
rspack_core = { workspace = true }
14+
rspack_error = { workspace = true }
15+
rspack_futures = { workspace = true }
16+
rspack_hook = { workspace = true }
17+
rspack_util = { workspace = true }
18+
tracing = { workspace = true }
1819

1920
[package.metadata.cargo-shear]
2021
ignored = ["tracing"]

crates/rspack_plugin_size_limits/src/lib.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rspack_core::{
66
ApplyContext, ChunkGroup, ChunkGroupUkey, Compilation, CompilationAsset, CompilerAfterEmit,
77
CompilerOptions, Plugin, PluginContext,
88
};
9-
use rspack_error::{Diagnostic, Result};
9+
use rspack_error::{Diagnostic, Result, ToStringResultToRspackResultExt};
1010
use rspack_hook::{plugin, plugin_hook};
1111
use rspack_util::size::format_size;
1212

@@ -81,14 +81,14 @@ impl SizeLimitsPlugin {
8181
}
8282

8383
fn add_assets_over_size_limit_warning(
84-
detail: &[(&String, f64)],
84+
detail: &[(String, f64)],
8585
limit: f64,
8686
hints: &str,
8787
diagnostics: &mut Vec<Diagnostic>,
8888
) {
8989
let asset_list: String = detail
9090
.iter()
91-
.map(|&(name, size)| format!("\n {} ({})", name, format_size(size)))
91+
.map(|(name, size)| format!("\n {} ({})", name, format_size(*size)))
9292
.collect::<Vec<String>>()
9393
.join("");
9494
let title = String::from("assets over size limit warning");
@@ -140,21 +140,33 @@ async fn after_emit(&self, compilation: &mut Compilation) -> Result<()> {
140140

141141
let mut assets_over_size_limit = vec![];
142142

143-
for (name, asset) in compilation.assets() {
144-
let source = asset.get_source();
143+
let asset_sizes = rspack_futures::scope::<_, _>(|token| {
144+
compilation.assets().iter().for_each(|(name, asset)| {
145+
// SAFETY: await immediately and trust caller to poll future entirely
146+
let s = unsafe { token.used((&self, asset, name, max_asset_size)) };
145147

146-
if !self.asset_filter(name, asset).await {
147-
continue;
148-
}
148+
s.spawn(|(plugin, asset, name, max_asset_size)| async move {
149+
if !plugin.asset_filter(name, asset).await {
150+
return None;
151+
}
149152

150-
if let Some(source) = source {
151-
let size = source.size() as f64;
152-
let is_over_size_limit = size > max_asset_size;
153+
let source = asset.get_source()?;
153154

154-
checked_assets.insert(name.to_owned(), is_over_size_limit);
155-
if is_over_size_limit {
156-
assets_over_size_limit.push((name, size));
157-
}
155+
let size = source.size() as f64;
156+
let is_over_size_limit = size > max_asset_size;
157+
Some((name.clone(), size, is_over_size_limit))
158+
})
159+
})
160+
})
161+
.await
162+
.into_iter()
163+
.map(|res| res.to_rspack_result())
164+
.collect::<Result<Vec<_>>>()?;
165+
166+
for (name, size, is_over_size_limit) in asset_sizes.into_iter().flatten() {
167+
checked_assets.insert(name.clone(), is_over_size_limit);
168+
if is_over_size_limit {
169+
assets_over_size_limit.push((name, size));
158170
}
159171
}
160172

0 commit comments

Comments
 (0)