Skip to content

perf(bench): remove scan benchmark binary to halve LTO link time#8694

Merged
Boshen merged 1 commit intomainfrom
perf/remove-scan-benchmark
Mar 14, 2026
Merged

perf(bench): remove scan benchmark binary to halve LTO link time#8694
Boshen merged 1 commit intomainfrom
perf/remove-scan-benchmark

Conversation

@Boshen
Copy link
Copy Markdown
Member

@Boshen Boshen commented Mar 14, 2026

Summary

  • Remove the redundant scan benchmark binary — since bundle (which calls generate()) already includes scanning, it was duplicating work
  • Each benchmark binary triggers a separate fat LTO link pass (~57s locally, ~7-8 min on CI), so removing one binary cuts that cost in half
  • Rename bundle.rsbench.rs and consolidate to a single [[bench]] entry in Cargo.toml

🤖 Generated with Claude Code

Each benchmark binary triggers a separate ~57s fat LTO link pass locally
(~7-8 min on CI). Since bundle (which calls generate()) already includes
scanning, the scan benchmarks are redundant. Removing the scan binary
cuts the LTO linking cost in half.

- Rename bundle.rs → bench.rs
- Delete scan.rs
- Update Cargo.toml to single bench entry

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 14, 2026 15:42
@netlify
Copy link
Copy Markdown

netlify bot commented Mar 14, 2026

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 40f8459
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/69b581e32dcef40008672586

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR streamlines the Rust benchmarking crate by consolidating benchmarks into a single binary to reduce repeated fat LTO link passes, improving CI/local benchmark turnaround time.

Changes:

  • Removed the dedicated scan benchmark binary since bundle already includes scanning as part of generate().
  • Consolidated benches into a single benchmark binary (bench.rs).
  • Updated crates/bench/Cargo.toml to a single [[bench]] entry.

Reviewed changes

Copilot reviewed 2 out of 3 changed files in this pull request and generated no comments.

File Description
crates/bench/benches/scan.rs Removes the redundant scan benchmark binary.
crates/bench/benches/bench.rs Adds the consolidated benchmark entrypoint and benchmark set.
crates/bench/Cargo.toml Switches from two bench targets (bundle, scan) to one (bench).

You can also share your feedback on Copilot code review. Take the survey.

@Boshen
Copy link
Copy Markdown
Member Author

Boshen commented Mar 14, 2026

Why do we have scan anyway when bundle includes scan?

@Boshen
Copy link
Copy Markdown
Member Author

Boshen commented Mar 14, 2026

The scan benchmark was originally added in #1410 (June 2024) when the monolithic threejs.rs benchmark was split into separate bundle.rs and scan.rs binaries, alongside adding the rome_ts preset. It was split to measure scan and bundle performance independently, but since bundle already performs scanning as part of its pipeline, the separate binary was redundant and doubled the fat LTO link cost.

@Boshen Boshen merged commit e088676 into main Mar 14, 2026
37 checks passed
@Boshen Boshen deleted the perf/remove-scan-benchmark branch March 14, 2026 15:54
@github-actions
Copy link
Copy Markdown
Contributor

Benchmarks Rust

group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.02     65.2±1.91ms        ? ?/sec    1.00     63.8±1.34ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.01     73.9±2.59ms        ? ?/sec    1.00     72.9±1.77ms        ? ?/sec
bundle/bundle@rome_ts                                        1.02    147.9±6.94ms        ? ?/sec    1.00    145.2±4.10ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.01    173.1±6.26ms        ? ?/sec    1.00    171.7±6.70ms        ? ?/sec
bundle/bundle@threejs                                        1.00     62.4±1.16ms        ? ?/sec    1.01     62.9±1.59ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.01     74.8±3.18ms        ? ?/sec    1.00     74.2±2.79ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00   759.5±11.94ms        ? ?/sec    1.02    772.5±6.88ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00   865.5±21.42ms        ? ?/sec    1.00   867.4±11.58ms        ? ?/sec
scan/scan@rome_ts                                                                                   1.00     63.1±1.17ms        ? ?/sec
scan/scan@threejs                                                                                   1.00     23.5±1.58ms        ? ?/sec
scan/scan@threejs10x                                                                                1.00    232.2±3.71ms        ? ?/sec

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Mar 14, 2026

Merging this PR will create unknown performance changes

🆕 6 new benchmarks
⏩ 8 skipped benchmarks1

Performance Changes

Benchmark BASE HEAD Efficiency
🆕 bundle@multi-duplicated-top-level-symbol N/A 276.9 ms N/A
🆕 bundle@threejs-sourcemap N/A 349.6 ms N/A
🆕 bundle@multi-duplicated-top-level-symbol-sourcemap N/A 325.9 ms N/A
🆕 bundle@rome_ts N/A 633.8 ms N/A
🆕 bundle@threejs N/A 283.4 ms N/A
🆕 bundle@rome_ts-sourcemap N/A 760.6 ms N/A

Comparing perf/remove-scan-benchmark (40f8459) with main (52e84dd)2

Open in CodSpeed

Footnotes

  1. 8 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

  2. No successful run was found on main (a532de9) during the generation of this report, so 52e84dd was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

This was referenced Mar 18, 2026
shulaoda added a commit that referenced this pull request Mar 18, 2026
## [1.0.0-rc.10] - 2026-03-18

### 🚀 Features

- add indentExclusionRanges property to MagicString (#8746) by @IWANABETHATGUY
- expose `oxcRuntimePlugin` (#8654) by @sapphi-red
- rust: make bundler generic over FileSystem for in-memory benchmarks (#8652) by @Boshen

### 🐛 Bug Fixes

- rolldown_plugin_vite_dynamic_import_vars: align dynamic import fast check with Vite (#8760) by @shulaoda
- renamer: handle existing bindings in nested scopes when finding unique names (#8741) by @drewolson
- pass `yarn_pnp` option where needed (#8736) by @sapphi-red
- preserve optional chaining in namespace member expr rewrite (#8712) by @Copilot
- correct UTF-16 index handling in native MagicString (#8693) by @IWANABETHATGUY
- mark failing doctests as ignore (#8700) by @Boshen
- prevent may_partial_namespace from leaking through include_module (#8682) by @IWANABETHATGUY
- ci: bump native-build cache key to invalidate stale napi-rs artifacts (#8678) by @Boshen
- `comments.annotation: false` breaking tree-shaking (#8657) by @IWANABETHATGUY
- validate filenames for NUL bytes from chunkFileNames/entryFileNames (#8644) by @IWANABETHATGUY
- dce-only minify should not set NODE_ENV to production (#8651) by @IWANABETHATGUY

### 🚜 Refactor

- rust: remove dead `CrossModuleOptimizationConfig::side_effects_free_function_optimization` (#8673) by @Dunqing
- rust: simplify `cross_module_optimization` by removing redundant scope tracking (#8672) by @Dunqing
- simplify string repeat in guess_indentor (#8753) by @IWANABETHATGUY
- consolidate custom magic-string tests into one file (#8696) by @IWANABETHATGUY
- extract CJS bailout checks from include_symbol (#8683) by @IWANABETHATGUY
- rust: remove `BindingIdentifierExt` to use `BindingIdentifier::symbol_id()` instead (#8667) by @Dunqing
- bench: add bench_preset helper and inline presets (#8658) by @Boshen
- rust: filter external modules from entries instead of mapping bit positions (#8637) by @Dunqing

### 📚 Documentation

- clarify watch mode behavior and its limitations (#8751) by @sapphi-red
- add external link icon to GitHub button in Hero section (#8731) by @thisisnkc
- guide: clarify that `inject` option is only conceptually similar to esbuild's one (#8743) by @sapphi-red
- meta/design: add `devtools.md` (#8663) by @hyf0
- add viteplus alpha announcement banner (#8668) by @shulaoda

### ⚡ Performance

- rolldown: some minor perf optimization found by autoresearch (#8730) by @Brooooooklyn
- replace Vec allocation with lazy iterator in find_hash_placeholders (#8703) by @Boshen
- replace TypedDashMap with TypedMap in CustomField (#8708) by @Boshen
- bench: remove scan benchmark binary to halve LTO link time (#8694) by @Boshen

### 🧪 Testing

- watch: increase timeout for error output (#8766) by @sapphi-red
- vite-tests: remove JS plugin tests (#8767) by @sapphi-red
- watch: add CLI exit code test (#8752) by @sapphi-red
- normalize paths on Windows even if `resolve.symlinks` is false (#8483) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- correct comment in bundle-analyzer-plugin.ts (#8770) by @origami-z
- upgrade oxc to 0.120.0 (#8764) by @Boshen
- enable all test for `reset` category in MagicString.test.ts (#8749) by @IWANABETHATGUY
- deps: update test262 submodule for tests (#8742) by @sapphi-red
- deps: update oxc apps (#8734) by @renovate[bot]
- deps: update softprops/action-gh-release action to v2.6.1 (#8724) by @renovate[bot]
- deps: update npm packages (major) (#8722) by @renovate[bot]
- deps: update github-actions (major) (#8721) by @renovate[bot]
- deps: update softprops/action-gh-release action to v2.6.0 (#8720) by @renovate[bot]
- deps: update npm packages (#8718) by @renovate[bot]
- deps: update rust crates (#8717) by @renovate[bot]
- deps: update github-actions (#8716) by @renovate[bot]
- deps: update dependency oxlint-tsgolint to v0.17.0 (#8713) by @renovate[bot]
- deps: bump cargo-shear to v1.11.2 (#8711) by @Boshen
- use org level `CODE_OF_CONDUCT.md` (#8706) by @sapphi-red
- fix cache key mismatch and remove redundant cache saves (#8695) by @Boshen
- deps: update oxc apps (#8692) by @renovate[bot]
- deps: update oxc apps (#8649) by @renovate[bot]
- should do matrix out side of reusable workflows 2 (#8691) by @hyf0
- should do matrix out side of reusable workflows (#8690) by @hyf0
- deps: update dependency rolldown-plugin-dts to v0.22.5 (#8689) by @renovate[bot]
- upgrade oxc to 0.119.0 and oxc_resolver to 11.19.1 (#8686) by @Boshen
- correct if condition of `type-check` job (#8677) by @hyf0
- Gate CI type-check job on node changes (#8669) by @Copilot
- benchmark: improve codspeed build (#8665) by @Boshen
- deps: update oxc to v0.118.0 (#8650) by @renovate[bot]
- deps: update crate-ci/typos action to v1.44.0 (#8647) by @renovate[bot]
- deps: update oxc resolver to v11.19.1 (#8646) by @renovate[bot]
- deps: update dependency rust to v1.94.0 (#8648) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.22.4 (#8645) by @renovate[bot]

### ◀️ Revert

- Revert "ci: Gate CI type-check job on node changes" (#8674) by @hyf0
- "chore(deps): update dependency rust to v1.94.0 (#8648)" (#8660) by @shulaoda

### ❤️ New Contributors

* @origami-z made their first contribution in [#8770](#8770)
* @drewolson made their first contribution in [#8741](#8741)
* @thisisnkc made their first contribution in [#8731](#8731)

Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants