diff options
| author | Sébastien Theys <seb@odoo.com> | 2020-07-30 16:14:32 +0000 |
|---|---|---|
| committer | Sébastien Theys <seb@odoo.com> | 2020-07-31 09:43:01 +0000 |
| commit | 78bef3e08c04a45bdf9122e595160e42bf7af8e1 (patch) | |
| tree | e606c67646a48907979f9927438bc9691b2e6cd3 /addons/mail/static/src/env | |
| parent | 89bf21ba797d72ff624fbf88e97a40628f72e0d8 (diff) | |
[FIX] mail: improve performance of JS write, especially for x2m
- store `x2many` values as `Set`. This is conceptually more correct because
duplicates were already not allowed, and using a `Set` allows for much faster
operations such as checking the presence of a record in the relation, which is
done at every write, for every linked record.
- `stringify` in `write` was slow and unnecessary because we can always assume
that new non-primitive should be provided to `write`
- remove field values from store, in favor of just storing a counter, which is
enough to trigger renders. This allows to get rid of one Proxy level around
data, which was slower, but which also prevented from using `Set`.
- write in store exactly once per update cycle, to trigger one `useStore` call
on each component. Records keep `__state` but as a local counter, to let
`useStore` know which records have been updated (easier to compare a counter
than comparing each and every field value).
Results
=======
The worse case test (using a lot of x2m) that was used to benchmark this PR
`form_renderer_tests.js` of `mail_enterprise` went from taking around 4s before
this commit, to around 2.5s after this commit.
And the worse `_setRelationLinkMany2Many` previously took around 250ms, and it
now takes around 50ms.
The whole `mail` QUnit suite took around 55s before, now around 42s.
Part of task-2308312
closes odoo/odoo#55248
X-original-commit: 4db0a10d85534ef896f6bcbf13bca4983a6e2003
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Diffstat (limited to 'addons/mail/static/src/env')
| -rw-r--r-- | addons/mail/static/src/env/test_env.js | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/addons/mail/static/src/env/test_env.js b/addons/mail/static/src/env/test_env.js index 75e921c27c7..b7bf22010cb 100644 --- a/addons/mail/static/src/env/test_env.js +++ b/addons/mail/static/src/env/test_env.js @@ -34,7 +34,9 @@ function addMessagingToEnv(providedEnv = {}) { */ const store = new Store({ env, - state: {}, + state: { + messagingRevNumber: 0, + }, }); /** |
