InvokeAI/invokeai/frontend/web
psychedelicious 69ec14c7bb perf(ui): use rfdc for deep copying of objects
- Add and use more performant `deepClone` method for deep copying throughout the UI.

Benchmarks indicate the Really Fast Deep Clone library (`rfdc`) is the best all-around way to deep-clone large objects.

This is particularly relevant in canvas. When drawing or otherwise manipulating canvas objects, we need to do a lot of deep cloning of the canvas layer state objects.

Previously, we were using lodash's `cloneDeep`.

I did some fairly realistic benchmarks with a handful of deep-cloning algorithms/libraries (including the native `structuredClone`). I used a snapshot of the canvas state as the data to be copied:

On Chromium, `rfdc` is by far the fastest, over an order of magnitude faster than `cloneDeep`.

On FF, `fastest-json-copy` and `recursiveDeepCopy` are even faster, but are rather limited in data types. `rfdc`, while only half as fast as the former 2, is still nearly an order of magnitude faster than `cloneDeep`.

On Safari, `structuredClone` is the fastest, about 2x as fast as `cloneDeep`. `rfdc` is only 30% faster than `cloneDeep`.

`rfdc`'s peak memory usage is about 10% more than `cloneDeep` on Chrome. I couldn't get memory measurements from FF and Safari, but let's just assume the memory usage is similar relative to the other algos.

Overall, `rfdc` is the best choice for a single algo for all browsers. It's definitely the best for Chromium, by far the most popular desktop browser and thus our primary target.

A future enhancement might be to detect the browser and use that to determine which algorithm to use.
2024-04-02 08:48:18 -04:00
..
.storybook fix(ui): update all components and logic to use enriched ModelIdentifierField 2024-03-10 11:03:38 +11:00
patches feat(ui): patch reselect to use lruMemoize only 2024-01-06 00:03:07 +11:00
public translationBot(ui): update translation (Russian) 2024-04-02 13:15:11 +11:00
scripts feat(ui): add script to clean translations 2024-03-14 11:38:29 +11:00
src perf(ui): use rfdc for deep copying of objects 2024-04-02 08:48:18 -04:00
static/docs feat(ui): update assets 2024-01-12 08:02:59 +11:00
__init__.py Run python black 2023-07-28 09:46:44 -04:00
.eslintignore fix(ui): fix workflow editor model selector, excise ONNX 2024-01-03 13:18:50 +11:00
.eslintrc.js build(ui): restore i18n eslint rule 2024-03-01 10:42:33 +11:00
.gitignore tests(ui): enable vitest type testing 2024-03-01 10:42:33 +11:00
.prettierignore fix(ui): fix workflow editor model selector, excise ONNX 2024-01-03 13:18:50 +11:00
.prettierrc.js chore(ui): use new prettier config 2024-01-28 19:57:53 +11:00
index.html feat(ui): update assets 2024-01-12 08:02:59 +11:00
knip.ts build(ui): harden knip config, support @knipignore jsdoc tag 2024-03-28 12:24:32 +11:00
package.json perf(ui): use rfdc for deep copying of objects 2024-04-02 08:48:18 -04:00
pnpm-lock.yaml perf(ui): use rfdc for deep copying of objects 2024-04-02 08:48:18 -04:00
README.md docs: move frontend docs to mkdocs 2024-03-13 22:43:20 +11:00
tsconfig.json chore(ui): lint 2024-03-01 10:42:33 +11:00
tsconfig.node.json fix(ui): fix package build 2024-03-01 10:42:33 +11:00
vite.config.mts build(ui): do not fail build on eslint error in dev mode 2024-03-01 10:42:33 +11:00