WIP: Move default values to prototype to resolve v6 performance regression #9862
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.
Description
This is currently a proof of concept that should not be merged, but opening for visibility.
See #9852 for full context. In short, creating a large number of objects in v6 is significantly slower than doing so in v5. The root cause is the switch from assigning default values using object prototypes to setting defaults using
getDefaults
andObject.assign
.The relevant PR is here: #8719
The relevant block of code is here:
fabric.js/src/shapes/Object/Object.ts
Lines 285 to 288 in 26ed225
This PR implements the quick fix described in this comment, which essentially rolls back the change shown above.
IText.getDefaults
function, and allgetDefaults
functions it calls, are edited to return an empty object.getDefaults
functions are assigned to the object prototypes instead.This is currently a proof of concept--the final implementation obviously shouldn't have a bunch of
getDefaults
functions that do nothing.In Action
The improvement can be confirmed by visiting this web page containing a benchmark, and opening up the console (source code here). The relevant comparison is
v6
(the master branch) andv6 edited
(this PR). On my system the following is printed: