Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize useSelect calls (batch 1) #23255

Merged
merged 1 commit into from
Jun 26, 2020

Conversation

ZebulanStanphill
Copy link
Member

@ZebulanStanphill ZebulanStanphill commented Jun 17, 2020

Description

It turns out that there are a lot of useSelect calls missing a dependency array to memoize their callbacks. I initially planned to create a single PR to fix all of these; but it turns out that there are so many unoptimized useSelect calls that it's better to split it up into several batches. This is the first batch.

I also took this opportunity to remove some unneeded destructuring, which should help reduce the number of objects being created.

In cases where I found a useSelect call that had an incorrect dependency array (which could lead to buggy behavior), I've created a separate PR for it, e.g. #23249.

@ZebulanStanphill ZebulanStanphill added [Type] Performance Related to performance efforts [Type] Code Quality Issues or PRs that relate to code quality Good First Review A PR that's suitable for someone looking to contribute for the first time by reviewing code labels Jun 17, 2020
@github-actions
Copy link

github-actions bot commented Jun 17, 2020

Size Change: -7 B (0%)

Total Size: 1.13 MB

Filename Size Change
build/block-directory/index.js 7.37 kB +4 B (0%)
build/block-editor/index.js 109 kB -11 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 941 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-editor/style-rtl.css 10.7 kB 0 B
build/block-editor/style.css 10.7 kB 0 B
build/block-library/editor-rtl.css 7.59 kB 0 B
build/block-library/editor.css 7.6 kB 0 B
build/block-library/index.js 130 kB 0 B
build/block-library/style-rtl.css 8.04 kB 0 B
build/block-library/style.css 8.04 kB 0 B
build/block-library/theme-rtl.css 730 B 0 B
build/block-library/theme.css 732 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.2 kB 0 B
build/components/index.js 197 kB 0 B
build/components/style-rtl.css 15.8 kB 0 B
build/components/style.css 15.7 kB 0 B
build/compose/index.js 9.62 kB 0 B
build/core-data/index.js 11.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.44 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 569 B 0 B
build/dom/index.js 3.19 kB 0 B
build/edit-navigation/index.js 9.87 kB 0 B
build/edit-navigation/style-rtl.css 1.02 kB 0 B
build/edit-navigation/style.css 1.02 kB 0 B
build/edit-post/index.js 303 kB 0 B
build/edit-post/style-rtl.css 5.51 kB 0 B
build/edit-post/style.css 5.5 kB 0 B
build/edit-site/index.js 16.6 kB 0 B
build/edit-site/style-rtl.css 3.02 kB 0 B
build/edit-site/style.css 3.02 kB 0 B
build/edit-widgets/index.js 9.32 kB 0 B
build/edit-widgets/style-rtl.css 2.42 kB 0 B
build/edit-widgets/style.css 2.42 kB 0 B
build/editor/editor-styles-rtl.css 537 B 0 B
build/editor/editor-styles.css 539 B 0 B
build/editor/index.js 44.9 kB 0 B
build/editor/style-rtl.css 3.81 kB 0 B
build/editor/style.css 3.81 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.73 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 2.51 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.13 kB 0 B
build/list-reusable-blocks/style-rtl.css 450 B 0 B
build/list-reusable-blocks/style.css 451 B 0 B
build/media-utils/index.js 5.29 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 663 B 0 B
build/nux/style.css 660 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 14 kB 0 B
build/server-side-render/index.js 2.68 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

const isEmptyContent = isEmptyBlockList || isOnlyUnmodifiedDefault;
const isTemplatePickerAvailable = __experimentalUsePageTemplatePickerAvailable();

return isEmptyContent && isTemplatePickerAvailable;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this regresses in terms of performance. Returning a boolean from useSelect is way more performant in terms of shallow comparison.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I've changed it. Is it good now?

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice work

@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch from 04c04d5 to aa5710f Compare June 18, 2020 17:03
Comment on lines 32 to 33
isUnmodifiedDefaultBlock,
__experimentalUsePageTemplatePickerAvailable,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking about this more, since these are external functions, and they'll always be the same functions, I can remove them from the dependency array. Am I correct?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

__experimentalUsePageTemplatePickerAvailable

This reads like a hook, I don't think we should be using it "inside" useSelect, we may break the hooks rules that way.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for catching that. I've moved that out of the useSelect call and changed the dependency array to include isTemplatePickerAvailable. I've also removed isUnmodifiedDefaultBlock from the dependency array. That should be fine, right?

@gziolo
Copy link
Member

gziolo commented Jun 19, 2020

Interesting, I think we fixed all occurrences of useSelect a few months back 😅

Great catch, thanks for keeping an eye 👏

We really need this lint rule from React to error at least when there are no deps defined for hooks unless there is no way to define custom hooks there... then our own lint rule?

@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch from aa5710f to 8d35521 Compare June 19, 2020 14:13
Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Nice work

@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch 2 times, most recently from 2a80d1d to 0d461e1 Compare June 24, 2020 04:51
@youknowriad
Copy link
Contributor

Anything blocking here?

@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch from 0d461e1 to 7c38334 Compare June 24, 2020 14:40
@ZebulanStanphill
Copy link
Member Author

ZebulanStanphill commented Jun 24, 2020

@youknowriad The only blocking things are unrelated end-to-end test failures. 😛 I just rebased the branch and pushed the changes. When the tests go green, I'll merge.

@youknowriad
Copy link
Contributor

There are so many end 2 end tests failing that I don't think they are unrelated to this PR. Maybe it's better to split it into smaller PRs

@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch from 7c38334 to 8615cd5 Compare June 25, 2020 03:44
@ZebulanStanphill ZebulanStanphill force-pushed the fix/unoptimized-use-select-calls branch from 8615cd5 to 57e8b14 Compare June 25, 2020 14:38
@ZebulanStanphill
Copy link
Member Author

Alright, I shrunk down the PR, and it's passing now, so I'm going to go ahead and merge it.

@ZebulanStanphill ZebulanStanphill merged commit 153817e into master Jun 26, 2020
@ZebulanStanphill ZebulanStanphill deleted the fix/unoptimized-use-select-calls branch June 26, 2020 00:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Good First Review A PR that's suitable for someone looking to contribute for the first time by reviewing code [Type] Code Quality Issues or PRs that relate to code quality [Type] Performance Related to performance efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants