Skip to content

Comments

perf: use u32 for string indices in string_wizard and rolldown to reduce memory usage#7989

Merged
graphite-app[bot] merged 1 commit intomainfrom
01-21-perf_use_u32_instead_of_usize_to_store_span_related_data
Jan 21, 2026
Merged

perf: use u32 for string indices in string_wizard and rolldown to reduce memory usage#7989
graphite-app[bot] merged 1 commit intomainfrom
01-21-perf_use_u32_instead_of_usize_to_store_span_related_data

Conversation

@IWANABETHATGUY
Copy link
Member

@IWANABETHATGUY IWANABETHATGUY commented Jan 21, 2026

Rationale

  • oxc only supports parsing files up to 4GB, which fits within u32's range
  • string_wizard is an internal crate used exclusively by rolldown, so we don't need to consider broader scalability concerns

Copy link
Member Author


How to use the Graphite Merge Queue

Add the label graphite: merge-when-ready to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@netlify
Copy link

netlify bot commented Jan 21, 2026

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit 75a0ca6
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6970b6dfd28fcf0008ac0a27
😎 Deploy Preview https://deploy-preview-7989--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review January 21, 2026 11:25
Copilot AI review requested due to automatic review settings January 21, 2026 11:25
@netlify
Copy link

netlify bot commented Jan 21, 2026

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit cdc5187
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6971175519b2b500089ecd4b

@IWANABETHATGUY IWANABETHATGUY changed the title perf: use u32 instead of usize to store span related data fix: use u32 for string indices in string_wizard and rolldown Jan 21, 2026
Copy link
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 optimizes performance by changing span-related data structures from usize to u32 throughout the string_wizard crate and its consumers.

Changes:

  • Changed Span struct and all span-related fields from usize to u32 in the string_wizard crate
  • Updated all consumer code (plugins, rolldown, rolldown_binding) to cast indices appropriately when calling string_wizard APIs
  • Modified tests to cast usize values from len() calls to u32 when needed

Reviewed changes

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

Show a summary per file
File Description
crates/string_wizard/src/span.rs Changed Span tuple fields and methods from usize to u32
crates/string_wizard/src/source_map/locator.rs Changed line_offsets storage and location tracking to u32
crates/string_wizard/src/source_map/sourcemap_builder.rs Changed generated code line/column tracking to u32, removed unnecessary casts
crates/string_wizard/src/magic_string/*.rs Updated all MagicString method signatures to accept u32 indices instead of usize
crates/string_wizard/src/chunk.rs Changed chunk start/end methods to return u32
crates/rolldown_common/src/css/css_view.rs Changed at_import_ranges to store (u32, u32) tuples
crates/rolldown/src/css/mod.rs Added casts when working with oxc Span fields
crates/rolldown_binding/src/types/binding_magic_string.rs Added casts from usize byte indices to u32 for string_wizard calls
crates/rolldown_plugin_/src/.rs Added casts from usize or oxc Span to u32 when calling string_wizard APIs
crates/string_wizard/tests/*.rs Updated test code to cast indices to u32

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 21, 2026

Benchmarks Rust

  • target: main(eb0e97b)
  • pr: 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data(f3f1545)
group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.00     69.6±1.99ms        ? ?/sec    1.03     71.4±2.47ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.00     77.0±2.53ms        ? ?/sec    1.01     77.9±2.59ms        ? ?/sec
bundle/bundle@rome_ts                                        1.00    101.2±1.82ms        ? ?/sec    1.03    103.8±1.97ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.00    112.7±1.79ms        ? ?/sec    1.02    115.2±3.14ms        ? ?/sec
bundle/bundle@threejs                                        1.00     36.7±3.04ms        ? ?/sec    1.01     37.1±0.96ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.00     40.6±0.64ms        ? ?/sec    1.05     42.8±0.99ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00    369.6±4.30ms        ? ?/sec    1.02    378.8±6.83ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00    425.5±4.05ms        ? ?/sec    1.03    436.5±5.37ms        ? ?/sec
scan/scan@rome_ts                                            1.00     82.5±1.64ms        ? ?/sec    1.00     82.8±2.38ms        ? ?/sec
scan/scan@threejs                                            1.03     29.3±1.90ms        ? ?/sec    1.00     28.4±0.48ms        ? ?/sec
scan/scan@threejs10x                                         1.00    288.6±4.04ms        ? ?/sec    1.01    292.9±5.91ms        ? ?/sec

@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from 53fd067 to dcf13a6 Compare January 21, 2026 12:03
Copilot AI review requested due to automatic review settings January 21, 2026 12:05
Copy link
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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@IWANABETHATGUY IWANABETHATGUY marked this pull request as draft January 21, 2026 13:32
@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from 737ca26 to 4ee3e76 Compare January 21, 2026 17:00
@IWANABETHATGUY IWANABETHATGUY changed the title fix: use u32 for string indices in string_wizard and rolldown perf: use u32 for string indices in string_wizard and rolldown to reduce memory usage Jan 21, 2026
@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from 4ee3e76 to f3f1545 Compare January 21, 2026 17:19
@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review January 21, 2026 17:20
Copilot AI review requested due to automatic review settings January 21, 2026 17:20
Copy link
Member Author

IWANABETHATGUY commented Jan 21, 2026

Merge activity

  • Jan 21, 5:21 PM UTC: The merge label 'graphite: merge-when-ready' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jan 21, 6:13 PM UTC: IWANABETHATGUY added this pull request to the Graphite merge queue.
  • Jan 21, 6:22 PM UTC: Merged by the Graphite merge queue.

Copy link
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

Copilot reviewed 32 out of 32 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch 3 times, most recently from fa40d4b to e4b5a7e Compare January 21, 2026 17:42
Copilot AI review requested due to automatic review settings January 21, 2026 17:45
@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from e4b5a7e to 446f1f2 Compare January 21, 2026 17:45
Copy link
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

Copilot reviewed 32 out of 32 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@IWANABETHATGUY IWANABETHATGUY force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from 446f1f2 to 65b9799 Compare January 21, 2026 18:03
…uce memory usage (#7989)

## Rationale
- oxc only supports parsing files up to 4GB, which fits within `u32`'s range
- `string_wizard` is an internal crate used exclusively by rolldown, so we don't need to consider broader scalability concerns
Copilot AI review requested due to automatic review settings January 21, 2026 18:13
@graphite-app graphite-app bot force-pushed the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch from 65b9799 to cdc5187 Compare January 21, 2026 18:13
Copy link
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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@graphite-app graphite-app bot merged commit cdc5187 into main Jan 21, 2026
34 checks passed
@graphite-app graphite-app bot deleted the 01-21-perf_use_u32_instead_of_usize_to_store_span_related_data branch January 21, 2026 18:22
@github-actions github-actions bot mentioned this pull request Jan 22, 2026
shulaoda pushed a commit that referenced this pull request Jan 22, 2026
## [1.0.0-rc.1] - 2026-01-22

### 🚀 Features

- debug_info: add facade chunk elimination reason (#7980) by @IWANABETHATGUY
- support lazy barrel optimization (#7933) by @shulaoda
- add `experimental.lazyBarrel` option (#7908) by @shulaoda
- skip unused external modules from IIFE parameter list (#7978) by @sapphi-red
- add custom panic hook for better crash reporting (#7752) by @shulaoda
- treeshake: add `invalidImportSideEffects` option (#7958) by @shulaoda
- merge allow-extension emitted chunks (#7940) by @IWANABETHATGUY
- nativeMagicString generateMap (#7944) by @IWANABETHATGUY
- Include meta.magicString in RenderChunkMeta (#7943) by @IWANABETHATGUY
- debug_info: add debug info for eliminated facade chunks (#7946) by @IWANABETHATGUY
- stablize `strictExecutionOrder` and move to `output.strictExecutionOrder` from `experimental.strictExecutionOrder` (#7901) by @sapphi-red
- add documentation link to require() error message (#7898) by @Copilot
- add `codeSplitting: boolean` and deprecate `inlineDynamicImports` (#7870) by @hyf0
- dev: change lazy module URL to `/@vite/lazy` from `/lazy` (#7884) by @sapphi-red

### 🐛 Bug Fixes

- transform JS files containing `</script>` to escape template literals (#7987) by @IWANABETHATGUY
- apply avoid-breaking-exported-api = false to clippy.toml and fix clippy errors (#7982) by @Boshen
- pass `kind` from `this.resolve` (#7981) by @sapphi-red
- rolldown_plugin_vite_resolve: ignore yarn resolution errors and fallback to other resolvers (#7968) by @sapphi-red
- renamer: prevent renaming symbols when there no conflicts (#7936) by @Dunqing
- correct minifyInterExports when emitted chunk got merged (#7941) by @IWANABETHATGUY
- deduplicate entry points when module is both emitted and dynamically imported (#7885) by @IWANABETHATGUY
- dev: add `@vite-ignore` to lazy compilation proxy module import (#7883) by @sapphi-red

### 🚜 Refactor

- rust: enable clippy nursery lint group (#8002) by @Boshen
- rust: fix inconsistent_struct_constructor clippy lint (#7999) by @Boshen
- rust: fix needless_pass_by_ref_mut clippy lint (#7994) by @Boshen
- rust: fix unnecessary_wraps clippy lint (#7993) by @Boshen
- rust: fix enum_variant_names clippy lint (#7992) by @Boshen
- fix single_match clippy lint (#7997) by @Boshen
- rust: fix redundant_clone clippy lint (#7996) by @Boshen
- rust: rename CJS to Cjs to follow upper_case_acronyms lint (#7991) by @Boshen
- rust: remove unnecessary Box wrapper around Vec in MemberExprRef (#7990) by @Boshen
- import_record: make resolved_module optional (#7907) by @shulaoda
- remove unnecessary `.parse` (#7966) by @sapphi-red
- remove unused `ImportRecordMeta::IsPlainImport` (#7948) by @shulaoda
- proper set chunk meta (#7939) by @IWANABETHATGUY
- module_loader: remove `try_spawn_with_cache` (#7920) by @shulaoda
- link_stage: simplify `ImportStatus::NoMatch` to unit variant (#7909) by @shulaoda
- improve global scope symbol reservation in chunk deconfliction (#7906) by @IWANABETHATGUY
- simplify ast unwrapping in generate stage (#7900) by @IWANABETHATGUY
- generate_stage: optimize cross-chunk imports computation (#7889) by @shulaoda
- link_stage: move runtime require logic into match branch (#7892) by @shulaoda
- link_stage: simplify runtime require reference conditions (#7891) by @shulaoda
- link_stage: inline and simplify external dynamic import check (#7890) by @shulaoda
- generate_stage: simplify external module import collection logic (#7887) by @shulaoda
- avoid redundant module lookup in TLA computation (#7886) by @shulaoda
- dev: `devEngine.compileEntry` does not return null (#7882) by @sapphi-red
- dev: fix type errors for test HMR runtime (#7881) by @sapphi-red
- dev: move `clientId` property to `DevRuntime` base class (#7880) by @sapphi-red
- dev: generate client id in browser (#7878) by @hyf0

### 📚 Documentation

- apis: organize hook filters documentation and add composable filters section (#8003) by @sapphi-red
- update `vitepress-plugin-group-icons` (#7947) by @yuyinws
- add in-depth documentation for lazy barrel optimization (#7969) by @shulaoda
- bump theme & update activeMatch for reference (#7963) by @mdong1909
- mark `build()` API as experimental (#7954) by @sapphi-red
- enhance search functionality with improved scoring and filtering logic (#7935) by @hyf0
- add minor comments to multiple types (#7930) by @sapphi-red
- refactor advanedChunks related content to adapt manual code splitting concept (#7925) by @hyf0
- apis: add content to Bundler API page (#7926) by @sapphi-red
- apis: restructure plugin API related docs (#7924) by @sapphi-red
- add plugin API docs (#7923) by @sapphi-red
- apis: add docs to important APIs (#7913) by @sapphi-red
- move the important APIs to the top of the sidebar (#7912) by @sapphi-red
- apis: add more content to CLI documentation (#7911) by @sapphi-red
- apis: generate CLI docs from --help output (#7910) by @sapphi-red
- add fathom analytics (#7896) by @mdong1909

### ⚡ Performance

- use u32 for string indices in string_wizard and rolldown to reduce memory usage (#7989) by @IWANABETHATGUY
- rust: remove all usages of `with_scope_tree_child_ids(true)` for `SemanticBuilder` (#7995) by @Dunqing
- renamer: skip unnecessary nested scope symbol processing (#7899) by @Dunqing
- module_loader: use ArcStr for importer_id to avoid string copy (#7922) by @shulaoda
- module_loader: defer `ModuleTaskOwner` construction until needed (#7921) by @shulaoda
- renamer: optimize symbol renaming by eliminating `rename_non_root_symbol` pass (#7867) by @Dunqing

### 🧪 Testing

- add lazy barrel optimization test cases (#7967) by @shulaoda

### ⚙️ Miscellaneous Tasks

- remove lazy barrel option (#8010) by @shulaoda
- mark watch API as experimental (#8004) by @sapphi-red
- deps: update dependency lodash-es to v4.17.23 [security] (#8001) by @renovate[bot]
- git ignore zed local config (#7988) by @IWANABETHATGUY
- setup publint for published packages (#7972) by @Copilot
- enable `tagged_template_transform ` uncondionally (#7975) by @IWANABETHATGUY
- deps: update oxc to v0.110.0 (#7964) by @renovate[bot]
- deps: update oxc apps (#7962) by @renovate[bot]
- ai: add upgrade-oxc Claude skill (#7957) by @Boshen
- deps: update rollup submodule for tests to v4.55.2 (#7959) by @sapphi-red
- deps: update test262 submodule for tests (#7960) by @sapphi-red
- deps: update crate-ci/typos action to v1.42.1 (#7961) by @renovate[bot]
- deps: update rust crates (#7951) by @renovate[bot]
- deps: update npm packages (#7953) by @renovate[bot]
- deps: update github-actions (#7952) by @renovate[bot]
- deps: update npm packages (#7950) by @renovate[bot]
- format magic-string test before write to disk (#7945) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to ^0.21.0 (#7915) by @renovate[bot]
- deps: update dependency oxlint-tsgolint to v0.11.1 (#7914) by @renovate[bot]
- deps: update dependency diff to v8.0.3 [security] (#7904) by @renovate[bot]
- remove outdated TODO comment in `collect_depended_symbols` (#7888) by @shulaoda
- deps: update oxc resolver to v11.16.3 (#7876) by @renovate[bot]
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.

2 participants