Skip to content

refactor(module-concatenation): reduce try_to_add allocations#13741

Draft
LingyuCoder wants to merge 3 commits intomainfrom
codex/optimize-try-to-add
Draft

refactor(module-concatenation): reduce try_to_add allocations#13741
LingyuCoder wants to merge 3 commits intomainfrom
codex/optimize-try-to-add

Conversation

@LingyuCoder
Copy link
Copy Markdown
Contributor

Summary

  • reduce ModuleConcatenationPlugin::try_to_add hot-path allocations by caching import lists as Arc<[ModuleIdentifier]>
  • replace several filter(...).collect::<Vec<_>>() checks with single-pass scans in module concatenation
  • add a small unit test covering stable first-seen ordering for the new unique module collector

Why

  • samply on cases/10000 showed try_to_add consuming a large share of module concatenation time, with noticeable IndexSet clone and temporary Vec allocation overhead
  • after this change, the same dev-build profile reduced try_to_add share within module concatenation from 32.74% to 27.24%

Validation

  • cargo fmt --all --check
  • cargo lint
  • cargo test -p rspack_plugin_javascript module_concatenation_plugin -- --nocapture

@github-actions github-actions Bot added the team The issue/pr is created by the member of Rspack. label Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 17, 2026

📝 Benchmark detail: Open

No benchmark data for commit ed6830a, trying parent...

Name Base (d6cf6e5) Current Change
10000_big_production-mode_disable-minimize + exec 14.1 s ± 308 ms 14.1 s ± 290 ms +0.05 %
10000_development-mode + exec 922 ms ± 26 ms 939 ms ± 25 ms +1.87 %
10000_development-mode_hmr + stats 169 ms ± 5.5 ms 170 ms ± 5.9 ms +0.06 %
10000_development-mode_noop-loader + exec 1.96 s ± 70 ms 1.98 s ± 141 ms +1.04 %
10000_production-mode + exec 1.05 s ± 47 ms 1.06 s ± 39 ms +0.99 %
10000_production-mode_persistent-cold + exec 1.24 s ± 49 ms 1.23 s ± 45 ms -0.68 %
10000_production-mode_persistent-hot + exec 627 ms ± 16 ms 626 ms ± 15 ms -0.19 %
10000_production-mode_source-map + exec 1.23 s ± 21 ms 1.24 s ± 49 ms +1.01 %
arco-pro_development-mode + exec 1.32 s ± 94 ms 1.36 s ± 75 ms +2.93 %
arco-pro_development-mode_hmr + stats 35 ms ± 0.61 ms 36 ms ± 1.3 ms +0.98 %
arco-pro_production-mode + exec 2.47 s ± 117 ms 2.49 s ± 138 ms +0.77 %
arco-pro_production-mode_generate-package-json-webpack-plugin + exec 2.54 s ± 82 ms 2.53 s ± 134 ms -0.28 %
arco-pro_production-mode_persistent-cold + exec 2.5 s ± 127 ms 2.53 s ± 47 ms +1.08 %
arco-pro_production-mode_persistent-hot + exec 555 ms ± 264 ms 558 ms ± 277 ms +0.58 %
arco-pro_production-mode_source-map + exec 2.98 s ± 154 ms 2.94 s ± 89 ms -1.61 %
arco-pro_production-mode_traverse-chunk-modules + exec 2.5 s ± 101 ms 2.51 s ± 74 ms +0.27 %
bundled-threejs_development-mode + exec 177 ms ± 2.9 ms 180 ms ± 4.4 ms +1.81 %
bundled-threejs_production-mode + exec 214 ms ± 6.6 ms 211 ms ± 6.9 ms -1.31 %
large-dyn-imports_development-mode + exec 1.18 s ± 28 ms 1.17 s ± 69 ms -0.49 %
large-dyn-imports_production-mode + exec 1.27 s ± 56 ms 1.29 s ± 38 ms +1.22 %
threejs_development-mode_10x + exec 825 ms ± 9 ms 825 ms ± 38 ms -0.02 %
threejs_development-mode_10x_hmr + stats 119 ms ± 6.7 ms 115 ms ± 5.6 ms -3.32 %
threejs_production-mode_10x + exec 3.03 s ± 104 ms 3 s ± 26 ms -1.10 %
threejs_production-mode_10x_persistent-cold + exec 3.15 s ± 30 ms 3.15 s ± 27 ms -0.09 %
threejs_production-mode_10x_persistent-hot + exec 406 ms ± 9.7 ms 418 ms ± 74 ms +2.95 %
threejs_production-mode_10x_source-map + exec 3.77 s ± 23 ms 3.79 s ± 115 ms +0.60 %
10000_big_production-mode_disable-minimize + rss memory 1978 MiB ± 25.9 MiB 1985 MiB ± 61 MiB +0.33 %
10000_development-mode + rss memory 591 MiB ± 22.1 MiB 588 MiB ± 9.94 MiB -0.47 %
10000_development-mode_hmr + rss memory 817 MiB ± 40.3 MiB 814 MiB ± 45.6 MiB -0.32 %
10000_development-mode_noop-loader + rss memory 875 MiB ± 17.7 MiB 880 MiB ± 4.81 MiB +0.58 %
10000_production-mode + rss memory 536 MiB ± 9.25 MiB 533 MiB ± 17.7 MiB -0.63 %
10000_production-mode_persistent-cold + rss memory 701 MiB ± 11.2 MiB 702 MiB ± 13 MiB +0.14 %
10000_production-mode_persistent-hot + rss memory 608 MiB ± 8.01 MiB 608 MiB ± 21.2 MiB -0.01 %
10000_production-mode_source-map + rss memory 549 MiB ± 12.1 MiB 556 MiB ± 15.8 MiB +1.24 %
arco-pro_development-mode + rss memory 479 MiB ± 17.3 MiB 476 MiB ± 5.65 MiB -0.50 %
arco-pro_development-mode_hmr + rss memory 495 MiB ± 16.4 MiB 496 MiB ± 12.2 MiB +0.12 %
arco-pro_production-mode + rss memory 661 MiB ± 66.8 MiB 670 MiB ± 10.1 MiB +1.38 %
arco-pro_production-mode_generate-package-json-webpack-plugin + rss memory 688 MiB ± 20.6 MiB 690 MiB ± 9.28 MiB +0.34 %
arco-pro_production-mode_persistent-cold + rss memory 734 MiB ± 8.49 MiB 737 MiB ± 11.9 MiB +0.38 %
arco-pro_production-mode_persistent-hot + rss memory 395 MiB ± 29.6 MiB 395 MiB ± 33.8 MiB 0.00 %
arco-pro_production-mode_source-map + rss memory 756 MiB ± 28.9 MiB 752 MiB ± 16.6 MiB -0.44 %
arco-pro_production-mode_traverse-chunk-modules + rss memory 670 MiB ± 14.5 MiB 672 MiB ± 7.98 MiB +0.26 %
bundled-threejs_development-mode + rss memory 151 MiB ± 7.49 MiB 156 MiB ± 9.37 MiB +3.30 %
bundled-threejs_production-mode + rss memory 177 MiB ± 8.53 MiB 178 MiB ± 6.8 MiB +0.71 %
large-dyn-imports_development-mode + rss memory 567 MiB ± 18.4 MiB 586 MiB ± 21.5 MiB +3.32 %
large-dyn-imports_production-mode + rss memory 459 MiB ± 6.74 MiB 469 MiB ± 6.73 MiB +2.27 %
threejs_development-mode_10x + rss memory 539 MiB ± 11.1 MiB 533 MiB ± 14.9 MiB -0.99 %
threejs_development-mode_10x_hmr + rss memory 676 MiB ± 12 MiB 674 MiB ± 31.4 MiB -0.25 %
threejs_production-mode_10x + rss memory 697 MiB ± 20 MiB 727 MiB ± 7.61 MiB +4.32 %
threejs_production-mode_10x_persistent-cold + rss memory 650 MiB ± 22 MiB 659 MiB ± 27.8 MiB +1.41 %
threejs_production-mode_10x_persistent-hot + rss memory 458 MiB ± 15.1 MiB 473 MiB ± 12.2 MiB +3.38 %
threejs_production-mode_10x_source-map + rss memory 815 MiB ± 28.2 MiB 820 MiB ± 17.5 MiB +0.66 %

@LingyuCoder LingyuCoder changed the title [codex] refactor(module-concatenation): reduce try_to_add allocations refactor(module-concatenation): reduce try_to_add allocations Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 17, 2026

📦 Binary Size-limit

Comparing 5038dc9 to chore(ci): run size limit on main (#13740) by pshu

🎉 Size decreased by 4.00KB from 62.72MB to 62.72MB (⬇️0.01%)

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 17, 2026

Merging this PR will degrade performance by 3.02%

⚡ 2 improved benchmarks
❌ 2 regressed benchmarks
✅ 30 untouched benchmarks

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation rust@persistent_cache_restore_after_single_file_change@basic-react-development 28.2 ms 28.5 ms -1.05%
Simulation rust@persistent_cache_restore@basic-react-development 26.1 ms 26.9 ms -3.02%
Simulation rust@concatenate_module_code_generation 142.8 ms 136.7 ms +4.44%
Simulation rust@create_concatenate_module 41.2 ms 39.8 ms +3.46%

Comparing codex/optimize-try-to-add (5038dc9) with main (d6cf6e5)1

Open in CodSpeed

Footnotes

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 17, 2026

📝 Benchmark detail: Open

No benchmark data for commit ed6830a, trying parent...

Name Base (d6cf6e5) Current Change
10000_big_production-mode_disable-minimize + exec 14.1 s ± 308 ms 14.1 s ± 325 ms +0.26 %
10000_development-mode + exec 922 ms ± 26 ms 929 ms ± 17 ms +0.74 %
10000_development-mode_hmr + stats 169 ms ± 5.5 ms 173 ms ± 7.6 ms +1.92 %
10000_development-mode_noop-loader + exec 1.96 s ± 70 ms 1.99 s ± 112 ms +1.75 %
10000_production-mode + exec 1.05 s ± 47 ms 1.06 s ± 26 ms +1.01 %
10000_production-mode_persistent-cold + exec 1.24 s ± 49 ms 1.24 s ± 21 ms +0.23 %
10000_production-mode_persistent-hot + exec 627 ms ± 16 ms 639 ms ± 11 ms +1.82 %
10000_production-mode_source-map + exec 1.23 s ± 21 ms 1.23 s ± 34 ms +0.20 %
arco-pro_development-mode + exec 1.32 s ± 94 ms 1.31 s ± 63 ms -0.77 %
arco-pro_development-mode_hmr + stats 35 ms ± 0.61 ms 36 ms ± 0.58 ms +0.77 %
arco-pro_production-mode + exec 2.47 s ± 117 ms 2.49 s ± 48 ms +0.83 %
arco-pro_production-mode_generate-package-json-webpack-plugin + exec 2.54 s ± 82 ms 2.6 s ± 281 ms +2.36 %
arco-pro_production-mode_persistent-cold + exec 2.5 s ± 127 ms 2.54 s ± 109 ms +1.51 %
arco-pro_production-mode_persistent-hot + exec 555 ms ± 264 ms 614 ms ± 16 ms +10.59 %
arco-pro_production-mode_source-map + exec 2.98 s ± 154 ms 2.95 s ± 131 ms -1.20 %
arco-pro_production-mode_traverse-chunk-modules + exec 2.5 s ± 101 ms 2.5 s ± 44 ms -0.08 %
bundled-threejs_development-mode + exec 177 ms ± 2.9 ms 178 ms ± 3.1 ms +0.68 %
bundled-threejs_production-mode + exec 214 ms ± 6.6 ms 210 ms ± 10 ms -1.59 %
large-dyn-imports_development-mode + exec 1.18 s ± 28 ms 1.18 s ± 35 ms +0.15 %
large-dyn-imports_production-mode + exec 1.27 s ± 56 ms 1.29 s ± 39 ms +1.05 %
threejs_development-mode_10x + exec 825 ms ± 9 ms 824 ms ± 24 ms -0.22 %
threejs_development-mode_10x_hmr + stats 119 ms ± 6.7 ms 119 ms ± 5.9 ms -0.05 %
threejs_production-mode_10x + exec 3.03 s ± 104 ms 3.03 s ± 97 ms -0.04 %
threejs_production-mode_10x_persistent-cold + exec 3.15 s ± 30 ms 3.18 s ± 30 ms +0.80 %
threejs_production-mode_10x_persistent-hot + exec 406 ms ± 9.7 ms 404 ms ± 5.7 ms -0.49 %
threejs_production-mode_10x_source-map + exec 3.77 s ± 23 ms 3.79 s ± 44 ms +0.48 %
10000_big_production-mode_disable-minimize + rss memory 1978 MiB ± 25.9 MiB 1961 MiB ± 51.6 MiB -0.87 %
10000_development-mode + rss memory 591 MiB ± 22.1 MiB 585 MiB ± 12 MiB -1.10 %
10000_development-mode_hmr + rss memory 817 MiB ± 40.3 MiB 816 MiB ± 27.9 MiB -0.04 %
10000_development-mode_noop-loader + rss memory 875 MiB ± 17.7 MiB 871 MiB ± 13 MiB -0.48 %
10000_production-mode + rss memory 536 MiB ± 9.25 MiB 535 MiB ± 7.12 MiB -0.24 %
10000_production-mode_persistent-cold + rss memory 701 MiB ± 11.2 MiB 695 MiB ± 15.1 MiB -0.88 %
10000_production-mode_persistent-hot + rss memory 608 MiB ± 8.01 MiB 611 MiB ± 15.4 MiB +0.39 %
10000_production-mode_source-map + rss memory 549 MiB ± 12.1 MiB 548 MiB ± 6.79 MiB -0.21 %
arco-pro_development-mode + rss memory 479 MiB ± 17.3 MiB 480 MiB ± 6.01 MiB +0.29 %
arco-pro_development-mode_hmr + rss memory 495 MiB ± 16.4 MiB 495 MiB ± 9.66 MiB -0.05 %
arco-pro_production-mode + rss memory 661 MiB ± 66.8 MiB 668 MiB ± 12.3 MiB +0.97 %
arco-pro_production-mode_generate-package-json-webpack-plugin + rss memory 688 MiB ± 20.6 MiB 684 MiB ± 13.2 MiB -0.66 %
arco-pro_production-mode_persistent-cold + rss memory 734 MiB ± 8.49 MiB 737 MiB ± 10.6 MiB +0.37 %
arco-pro_production-mode_persistent-hot + rss memory 395 MiB ± 29.6 MiB 394 MiB ± 16 MiB -0.13 %
arco-pro_production-mode_source-map + rss memory 756 MiB ± 28.9 MiB 752 MiB ± 15.5 MiB -0.44 %
arco-pro_production-mode_traverse-chunk-modules + rss memory 670 MiB ± 14.5 MiB 669 MiB ± 13.8 MiB -0.14 %
bundled-threejs_development-mode + rss memory 151 MiB ± 7.49 MiB 152 MiB ± 8.39 MiB +0.43 %
bundled-threejs_production-mode + rss memory 177 MiB ± 8.53 MiB 176 MiB ± 4.97 MiB -0.86 %
large-dyn-imports_development-mode + rss memory 567 MiB ± 18.4 MiB 567 MiB ± 6.45 MiB -0.02 %
large-dyn-imports_production-mode + rss memory 459 MiB ± 6.74 MiB 458 MiB ± 3.93 MiB -0.09 %
threejs_development-mode_10x + rss memory 539 MiB ± 11.1 MiB 541 MiB ± 15.2 MiB +0.47 %
threejs_development-mode_10x_hmr + rss memory 676 MiB ± 12 MiB 668 MiB ± 15.1 MiB -1.13 %
threejs_production-mode_10x + rss memory 697 MiB ± 20 MiB 703 MiB ± 18.3 MiB +0.90 %
threejs_production-mode_10x_persistent-cold + rss memory 650 MiB ± 22 MiB 652 MiB ± 14.9 MiB +0.32 %
threejs_production-mode_10x_persistent-hot + rss memory 458 MiB ± 15.1 MiB 456 MiB ± 12.4 MiB -0.38 %
threejs_production-mode_10x_source-map + rss memory 815 MiB ± 28.2 MiB 803 MiB ± 24.4 MiB -1.37 %

Threshold exceeded: ["arco-pro_production-mode_persistent-hot + exec"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release: refactor team The issue/pr is created by the member of Rspack.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant