perf: fast-path primitives in deepEnhancer#4683
Open
gesposito wants to merge 1 commit into
Open
Conversation
🦋 Changeset detectedLatest commit: 342d8f9 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
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.
What / why
deepEnhancerruns on every value that enters a deep observable — including every scalar write. For a primitive, it currently walks the full chain of type checks (isObservable,Array.isArray,isPlainObject,isES6Map,isES6Set,typeof function) before falling through toreturn v. Primitives can never be made observable, so this PR returns them immediately:Functions are deliberately excluded from the early return so they still get wrapped into
autoAction/flow. Behavior is unchanged for every input class — primitives previously fell through all checks and returned as-is.Benchmarks
From
npm -w mobx run test:performance(Node 26, macOS), alternating A/B runs againstmainwith a rebuild on each side. Consistent across the proxy and legacy suites and across repeated runs:All other benchmarks are within run-to-run noise.
Tests
Full suite passes. Added two tests pinning the fast-path boundary in
makereactive.js:null,undefined, symbol, bigint) passes through the deep enhancer unchangedautoActionA changeset (patch bump for
mobx) is included.Code change checklist
/docs. For new functionality, at leastAPI.mdshould be updated — N/A, internal change only, no public API or documented behavior affectednpm -w mobx run test:performance)