Avatar for the oxc-project user
oxc-project
oxc-resolver
BlogDocsChangelog

Performance History

Latest Results

chore: release v11.22.0 (#1228) ## πŸ€– New release * `oxc_resolver`: 11.21.3 -> 11.22.0 * `oxc_resolver_napi`: 11.21.3 -> 11.22.0 <details><summary><i><b>Changelog</b></i></summary><p> ## `oxc_resolver` <blockquote> ## [11.22.0](https://github.com/oxc-project/oxc-resolver/compare/v11.21.3...v11.22.0) - 2026-06-30 ### <!-- 0 -->πŸš€ Features - *(file_system)* make FileSystemOs cheaply cloneable and Debug ([#1230](https://github.com/oxc-project/oxc-resolver/pull/1230)) (by @Boshen) ### <!-- 2 -->🚜 Refactor - *(package-json)* dedupe simd/serde backends behind JSON traits ([#1229](https://github.com/oxc-project/oxc-resolver/pull/1229)) (by @Boshen) ### <!-- 3 -->πŸ“š Documentation - *(path)* trim verbose comments in normalize_with ([#1233](https://github.com/oxc-project/oxc-resolver/pull/1233)) (by @Boshen) ### <!-- 4 -->⚑ Performance - type-erase the filesystem into a non-generic ResolverImpl core ([#1255](https://github.com/oxc-project/oxc-resolver/pull/1255)) (by @Boshen) - reduce tsconfig paths binary size ([#1250](https://github.com/oxc-project/oxc-resolver/pull/1250)) (by @Boshen) - avoid UTF-8 validation on alias and .d.ts resolve hot paths ([#1244](https://github.com/oxc-project/oxc-resolver/pull/1244)) (by @Boshen) - *(alias)* skip UTF-8 validation of resolved path when no alias key matches ([#1240](https://github.com/oxc-project/oxc-resolver/pull/1240)) (by @Boshen) - *(tsconfig)* reuse cached lstat to avoid redundant stat in get_tsconfig ([#1238](https://github.com/oxc-project/oxc-resolver/pull/1238)) (by @Boshen) - *(resolve)* compute parent once in package.json scope walk ([#1235](https://github.com/oxc-project/oxc-resolver/pull/1235)) (by @Boshen) - *(specifier)* SIMD fast-reject of specifiers without query/fragment ([#1234](https://github.com/oxc-project/oxc-resolver/pull/1234)) (by @Boshen) - *(tsconfig)* cut allocations in glob ownership matching ([#1232](https://github.com/oxc-project/oxc-resolver/pull/1232)) (by @Boshen) - *(path)* drop Chain<Once, Components> in normalize_with ([#1231](https://github.com/oxc-project/oxc-resolver/pull/1231)) (by @Boshen) - *(browser-field)* fast-reject non-matching keys before normalize ([#1227](https://github.com/oxc-project/oxc-resolver/pull/1227)) (by @Boshen) ### Contributors * @Boshen * @renovate[bot] </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). Co-authored-by: oxc-guard[bot] <276638029+oxc-guard[bot]@users.noreply.github.com>
main
3 hours ago
chore: release v11.22.0
release-plz-2026-06-18T23-48-37Z
4 hours ago
perf: type-erase the filesystem into a non-generic ResolverImpl core (#1255) ## What Refactor `ResolverGeneric<Fs>` into a thin generic shell over a new non-generic `ResolverImpl` that type-erases the filesystem to `Arc<dyn FileSystem>`. The heavy resolution algorithm now lives on `ResolverImpl` and is reached through `ResolverGeneric<Fs>`'s `Deref`, so the public API is unchanged. ## Why `ResolverGeneric<Fs>` monomorphizes the entire resolution algorithm once per `Fs` type **and** once per downstream crate β€” cross-crate generic instantiations aren't shared in optimized builds, and fat-LTO doesn't merge them. In a real consumer (rolldown) the heavy methods (`load_node_modules`, `package_target_resolve`, `load_tsconfig`, `load_as_file`, ...) were each emitted **8Γ—**. Making the core non-generic emits it **once**. ## Measured impact (rolldown, fat-LTO release) - Every heavy resolver method: **8 copies β†’ 1** - `oxc_resolver` code in the binary: **728 KiB β†’ 282 KiB (βˆ’61%)** - Whole-binary `__text`: **βˆ’650 KiB** (downstream generic wrappers de-duplicate too) - All existing tests pass; no public API change. ## Perf Resolution is I/O-bound and the metadata cache absorbs most FS calls, so the `dyn` dispatch is perf-neutral. An A/B on `benches/resolver.rs` (static `ResolverGeneric<FileSystemOs>` vs an `Arc<dyn FileSystem>`-backed resolver) showed **≀0.6%** on the in-memory benchmark β€” the worst case, where there are no syscalls to amortize the vtable against β€” and **no measurable change** on real-disk resolution. ## Notes - `FileSystem::new` is gated `where Self: Sized` so the trait is object-safe; trait objects never call `new`. - The generic constructors gain `Fs: 'static` (required to coerce into `Arc<dyn FileSystem>`; satisfied by every real FS type). - `ResolverImpl` is currently `pub` and reached through `Deref`. If you'd rather keep it private, the shell can carry explicit forwarding methods instead β€” easy to switch. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
main
4 hours ago
[autofix.ci] apply automated fixes
perf/non-generic-resolver-core
4 hours ago
[autofix.ci] apply automated fixes
perf/non-generic-resolver-core
4 hours ago
chore: release v11.22.0
release-plz-2026-06-18T23-48-37Z
7 hours ago
ci: add crates environment to release workflow
codex/release-plz-crates-environment
8 hours ago

Latest Branches

CodSpeed Performance Gauge
+1%
chore: release v11.22.0#1228
4 hours ago
59cc99a
release-plz-2026-06-18T23-48-37Z
CodSpeed Performance Gauge
-1%
4 hours ago
bccc32d
perf/non-generic-resolver-core
CodSpeed Performance Gauge
-4%
8 hours ago
2ec8efa
codex/release-plz-crates-environment
Β© 2026 CodSpeed Technology
Home Terms Privacy Docs