perf(vite-resolve): cache importer existence checks#9443
Merged
Conversation
✅ Deploy Preview for rolldown-rs canceled.
|
f251230 to
940e617
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 940e617. Configure here.
Merging this PR will not alter performance
Comparing Footnotes
|
940e617 to
0e5fc81
Compare
sapphi-red
approved these changes
May 19, 2026
Member
Merge activity
|
### Summary - share Vite resolver caches through a small internal `ResolverCaches` object - cache positive `fs::exists(clean_url(importer))` results for absolute importers in `should_use_importer` - avoid caching negative existence results so watch rebuilds can observe files that appear later - clear the importer-existence cache together with the existing resolver caches ### Performance note This came from the LobeHub renderer profiling work. System Trace showed this path reducing repeated `stat64` calls in the resolver-heavy capture (`66102 -> 52656`, about 20%). The isolated LobeHub wall-clock benchmark did not show a measurable win: local without this cache was `8.508s ± 0.049`, and local with this cache was `8.523s ± 0.041`. So this should be reviewed as a syscall/cache reduction, not as a confirmed build-time speedup. ### Validation - `cargo fmt --check` - `cargo check -p rolldown_plugin_vite_resolve` - `cargo clippy -p rolldown_plugin_vite_resolve --all-targets -- -D warnings` - `cargo test -p rolldown_plugin_vite_resolve` - `pnpm --filter rolldown run build-native:release` - `pnpm --filter vite-tests test` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk performance tweak in resolver logic; behavior should be unchanged aside from caching positive `fs::exists` results, with cache cleared on `clear_cache()` to avoid stale state across rebuilds. > > **Overview** > Reduces repeated filesystem `exists`/`stat` calls in the Vite resolver by introducing a shared `ResolverCaches` object that is reused across all `Resolver` instances. > > `should_use_importer` now memoizes *positive* `fs::exists(clean_url(importer))` checks for absolute importers (and still skips caching negatives), and `Resolvers::clear_cache()` clears this new importer-existence cache alongside existing resolver caches. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 0e5fc81. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
0e5fc81 to
886329c
Compare
Merged
shulaoda
added a commit
that referenced
this pull request
May 20, 2026
## [1.0.2] - 2026-05-20 ### 🚀 Features - devtools: emit package size in PackageGraphReady (#9434) by @IWANABETHATGUY - devtools: classify package dependency types (#9427) by @IWANABETHATGUY - devtools: map packages to modules and chunks (#9426) by @IWANABETHATGUY - devtools: mark used packages (#9423) by @IWANABETHATGUY - devtools: make duplicate packages discoverable (#9422) by @IWANABETHATGUY - devtools: emit package metadata (#9421) by @IWANABETHATGUY - update oxc to 0.132.0 (#9449) by @shulaoda - update oxc to 0.131.0 (#9424) by @shulaoda - allow checks.* to escalate emissions to hard errors (#9388) by @IWANABETHATGUY - dev: support watcher options `include` and `exclude` (#9395) by @h-a-n-a - emit warnings for invalid pure annotations (#9381) by @Kyujenius ### 🐛 Bug Fixes - hash: keep chunk file names stable when an unrelated entry is added (#9444) by @hyf0 - call `codeSplitting.groups[].name` in deterministic order (#9457) by @sapphi-red - dev/lazy: make `resolve_id` idempotent when the resolved id is already a lazy entry (#9439) by @h-a-n-a - chunk-optimization: publish absorbed dynamic-entry namespace cross-chunk (#9448) by @IWANABETHATGUY - treeshake: propagate pure annotation through compound exprs (#9431) by @Dunqing - finalizer: skip redundant init call when barrel executes in same chunk (#9354) by @IWANABETHATGUY - linking: initialize wrapped ESM re-export owners (#9353) by @IWANABETHATGUY - do not inherit __toESM across chunks for named-only external imports (#9333) (#9415) by @IWANABETHATGUY - watcher: don't write output or emit events after close() (#9328) by @situ2001 - chunk-optimization: avoid unsafe dynamic-only merges (#9398) by @IWANABETHATGUY - cjs: rename CJS-wrapped locals that would shadow chunk-scope names (#9392) by @hyf0 - dev/lazy: watch lazy modules added in rebuilds (#9391) by @h-a-n-a ### 🚜 Refactor - rolldown_dev: move dev example to break publish cycle (#9465) by @Boshen - binding: drop unsafe napi string helper, hoist transform ArcStr (#9456) by @hyf0 - ecmascript_utils: split rewrite_ident_reference off JsxExt trait (#9417) by @IWANABETHATGUY - use `ThreadsafeFunction::call_async_catch` (#9390) by @sapphi-red ### 📚 Documentation - devtools: document @rolldown/debug usage and package graph consumption (#9435) by @IWANABETHATGUY - replace `Inter` with system font stack in OG template SVG (#9240) by @yvbopeng - remove `output.comments` warning as all issues have been resolved (#9393) by @sapphi-red - in-depth: clarify @__PURE__ scope and document positions (#9389) by @Kyujenius - readme: remove release candidate notice (#9387) by @shulaoda ### ⚡ Performance - vite-resolve: cache importer existence checks (#9443) by @Brooooooklyn - binding: reduce plugin string clones (#9436) by @Brooooooklyn ### 🧪 Testing - enable `legal_comments_inline` test (#9394) by @sapphi-red ### ⚙️ Miscellaneous Tasks - bump pnpm to v11.1.2 (#9447) by @Boshen - deps: update rust crates (#9461) by @renovate[bot] - deps: update rollup submodule for tests to v4.60.4 (#9453) by @rolldown-guard[bot] - deps: update test262 submodule for tests (#9454) by @rolldown-guard[bot] - deps: update npm packages (#9430) by @renovate[bot] - deps: update github actions (#9429) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.25.1 (#9452) by @renovate[bot] - deps: update rust crates (#9428) by @renovate[bot] - revert allow checks.* to escalate emissions to hard errors (#9388) (#9438) by @IWANABETHATGUY - update mimalloc-safe to 0.1.61 (#9413) by @shulaoda - deny `todo`, `unimplemented`, and `print_stderr` clippy lints (#9412) by @Boshen - deps: update mimalloc-safe to 0.1.60 (#9410) by @shulaoda - remove `pip install setuptools` workaround for node-gyp on macOS (#9370) by @sapphi-red - renovate: disable automerge to require manual approval (#9386) by @shulaoda - deps: update napi (#9385) by @renovate[bot] ### ❤️ New Contributors * @yvbopeng made their first contribution in [#9240](#9240) Co-authored-by: shulaoda <[email protected]>
V1OL3TF0X
pushed a commit
to V1OL3TF0X/rolldown
that referenced
this pull request
May 25, 2026
### Summary - share Vite resolver caches through a small internal `ResolverCaches` object - cache positive `fs::exists(clean_url(importer))` results for absolute importers in `should_use_importer` - avoid caching negative existence results so watch rebuilds can observe files that appear later - clear the importer-existence cache together with the existing resolver caches ### Performance note This came from the LobeHub renderer profiling work. System Trace showed this path reducing repeated `stat64` calls in the resolver-heavy capture (`66102 -> 52656`, about 20%). The isolated LobeHub wall-clock benchmark did not show a measurable win: local without this cache was `8.508s ± 0.049`, and local with this cache was `8.523s ± 0.041`. So this should be reviewed as a syscall/cache reduction, not as a confirmed build-time speedup. ### Validation - `cargo fmt --check` - `cargo check -p rolldown_plugin_vite_resolve` - `cargo clippy -p rolldown_plugin_vite_resolve --all-targets -- -D warnings` - `cargo test -p rolldown_plugin_vite_resolve` - `pnpm --filter rolldown run build-native:release` - `pnpm --filter vite-tests test` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk performance tweak in resolver logic; behavior should be unchanged aside from caching positive `fs::exists` results, with cache cleared on `clear_cache()` to avoid stale state across rebuilds. > > **Overview** > Reduces repeated filesystem `exists`/`stat` calls in the Vite resolver by introducing a shared `ResolverCaches` object that is reused across all `Resolver` instances. > > `should_use_importer` now memoizes *positive* `fs::exists(clean_url(importer))` checks for absolute importers (and still skips caching negatives), and `Resolvers::clear_cache()` clears this new importer-existence cache alongside existing resolver caches. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 0e5fc81. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
V1OL3TF0X
pushed a commit
to V1OL3TF0X/rolldown
that referenced
this pull request
May 25, 2026
## [1.0.2] - 2026-05-20 ### 🚀 Features - devtools: emit package size in PackageGraphReady (rolldown#9434) by @IWANABETHATGUY - devtools: classify package dependency types (rolldown#9427) by @IWANABETHATGUY - devtools: map packages to modules and chunks (rolldown#9426) by @IWANABETHATGUY - devtools: mark used packages (rolldown#9423) by @IWANABETHATGUY - devtools: make duplicate packages discoverable (rolldown#9422) by @IWANABETHATGUY - devtools: emit package metadata (rolldown#9421) by @IWANABETHATGUY - update oxc to 0.132.0 (rolldown#9449) by @shulaoda - update oxc to 0.131.0 (rolldown#9424) by @shulaoda - allow checks.* to escalate emissions to hard errors (rolldown#9388) by @IWANABETHATGUY - dev: support watcher options `include` and `exclude` (rolldown#9395) by @h-a-n-a - emit warnings for invalid pure annotations (rolldown#9381) by @Kyujenius ### 🐛 Bug Fixes - hash: keep chunk file names stable when an unrelated entry is added (rolldown#9444) by @hyf0 - call `codeSplitting.groups[].name` in deterministic order (rolldown#9457) by @sapphi-red - dev/lazy: make `resolve_id` idempotent when the resolved id is already a lazy entry (rolldown#9439) by @h-a-n-a - chunk-optimization: publish absorbed dynamic-entry namespace cross-chunk (rolldown#9448) by @IWANABETHATGUY - treeshake: propagate pure annotation through compound exprs (rolldown#9431) by @Dunqing - finalizer: skip redundant init call when barrel executes in same chunk (rolldown#9354) by @IWANABETHATGUY - linking: initialize wrapped ESM re-export owners (rolldown#9353) by @IWANABETHATGUY - do not inherit __toESM across chunks for named-only external imports (rolldown#9333) (rolldown#9415) by @IWANABETHATGUY - watcher: don't write output or emit events after close() (rolldown#9328) by @situ2001 - chunk-optimization: avoid unsafe dynamic-only merges (rolldown#9398) by @IWANABETHATGUY - cjs: rename CJS-wrapped locals that would shadow chunk-scope names (rolldown#9392) by @hyf0 - dev/lazy: watch lazy modules added in rebuilds (rolldown#9391) by @h-a-n-a ### 🚜 Refactor - rolldown_dev: move dev example to break publish cycle (rolldown#9465) by @Boshen - binding: drop unsafe napi string helper, hoist transform ArcStr (rolldown#9456) by @hyf0 - ecmascript_utils: split rewrite_ident_reference off JsxExt trait (rolldown#9417) by @IWANABETHATGUY - use `ThreadsafeFunction::call_async_catch` (rolldown#9390) by @sapphi-red ### 📚 Documentation - devtools: document @rolldown/debug usage and package graph consumption (rolldown#9435) by @IWANABETHATGUY - replace `Inter` with system font stack in OG template SVG (rolldown#9240) by @yvbopeng - remove `output.comments` warning as all issues have been resolved (rolldown#9393) by @sapphi-red - in-depth: clarify @__PURE__ scope and document positions (rolldown#9389) by @Kyujenius - readme: remove release candidate notice (rolldown#9387) by @shulaoda ### ⚡ Performance - vite-resolve: cache importer existence checks (rolldown#9443) by @Brooooooklyn - binding: reduce plugin string clones (rolldown#9436) by @Brooooooklyn ### 🧪 Testing - enable `legal_comments_inline` test (rolldown#9394) by @sapphi-red ### ⚙️ Miscellaneous Tasks - bump pnpm to v11.1.2 (rolldown#9447) by @Boshen - deps: update rust crates (rolldown#9461) by @renovate[bot] - deps: update rollup submodule for tests to v4.60.4 (rolldown#9453) by @rolldown-guard[bot] - deps: update test262 submodule for tests (rolldown#9454) by @rolldown-guard[bot] - deps: update npm packages (rolldown#9430) by @renovate[bot] - deps: update github actions (rolldown#9429) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.25.1 (rolldown#9452) by @renovate[bot] - deps: update rust crates (rolldown#9428) by @renovate[bot] - revert allow checks.* to escalate emissions to hard errors (rolldown#9388) (rolldown#9438) by @IWANABETHATGUY - update mimalloc-safe to 0.1.61 (rolldown#9413) by @shulaoda - deny `todo`, `unimplemented`, and `print_stderr` clippy lints (rolldown#9412) by @Boshen - deps: update mimalloc-safe to 0.1.60 (rolldown#9410) by @shulaoda - remove `pip install setuptools` workaround for node-gyp on macOS (rolldown#9370) by @sapphi-red - renovate: disable automerge to require manual approval (rolldown#9386) by @shulaoda - deps: update napi (rolldown#9385) by @renovate[bot] ### ❤️ New Contributors * @yvbopeng made their first contribution in [rolldown#9240](rolldown#9240) Co-authored-by: shulaoda <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
ResolverCachesobjectfs::exists(clean_url(importer))results for absolute importers inshould_use_importerPerformance note
This came from the LobeHub renderer profiling work. System Trace showed this path reducing repeated
stat64calls in the resolver-heavy capture (66102 -> 52656, about 20%). The isolated LobeHub wall-clock benchmark did not show a measurable win: local without this cache was8.508s ± 0.049, and local with this cache was8.523s ± 0.041. So this should be reviewed as a syscall/cache reduction, not as a confirmed build-time speedup.Validation
cargo fmt --checkcargo check -p rolldown_plugin_vite_resolvecargo clippy -p rolldown_plugin_vite_resolve --all-targets -- -D warningscargo test -p rolldown_plugin_vite_resolvepnpm --filter rolldown run build-native:releasepnpm --filter vite-tests testNote
Low Risk
Low risk performance tweak in resolver logic; behavior should be unchanged aside from caching positive
fs::existsresults, with cache cleared onclear_cache()to avoid stale state across rebuilds.Overview
Reduces repeated filesystem
exists/statcalls in the Vite resolver by introducing a sharedResolverCachesobject that is reused across allResolverinstances.should_use_importernow memoizes positivefs::exists(clean_url(importer))checks for absolute importers (and still skips caching negatives), andResolvers::clear_cache()clears this new importer-existence cache alongside existing resolver caches.Reviewed by Cursor Bugbot for commit 0e5fc81. Bugbot is set up for automated code reviews on this repo. Configure here.