perf(Subscription): use instanceof
to avoid megamorphic LoadIC
#4499
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.
In
Subscription#add()
useinstanceof
to test whethersubscription
must be wrapped in a
Subscription
(aka for presence of_addParent
method), instead of
typeof subscription._addParent === 'function'
,as the latter is going to turn into a megamorphic property access
in any realistic application and cause quite a bit of contention on
the megamorphic stub cache in Node (aka V8).
The
instanceof
is definitely faster, even if the property accesswould hit the megamorphic stub cache. For example in the case of a
simple Angular Universal prerender test, just changing this can
reduce the number of megamorphic stub cache misses by around 2%.
Even in the case where the megamorphic stub cache hits all the time,
using
instanceof
is still faster. I put together a little micro-benchmark here. Running this with the latest V8 we get: