perf(synthetic-shadow): optimize recursivelySetShadowResolver #4088
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.
Details
Optimizes the
recursivelySetShadowResolver
function to avoid callingchildNodes
and to usefirstChild
/nextSibling
instead.Browsers represent the DOM as a linked list under the hood, so this is faster.
This improves the
dom-ss-slot-create-container-5k-this-change
benchmark by 4-9%, and possibly some other synthetic-shadow benchmarks as well.The reason this is important is because we set
KEY__SHADOW_STATIC
on the top level of a static fragment, which then causes us to recurse through the entire DOM structure to set theKEY__SHADOW_RESOLVER
. (This is used for the legacyisNodeShadowed
/isNodeFromTemplate
as well as for the patchedMutationObserver
.) If we have a lot of static fragments, or if they are very deep, then we can spend a lot of time recursing.Long-term, we should probably try to avoid this recursion entirely and just do the lookup on-demand when MutationObserver/
isNodeShadowed
is called: #4089Does this pull request introduce a breaking change?
Does this pull request introduce an observable change?