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

Lazy render block types in the inserter #33749

Merged
merged 7 commits into from
Jul 30, 2021

Conversation

youknowriad
Copy link
Contributor

Opening the inserter is very a slow operation, it takes approximatively 360ms according to our metrics https://codehealth-riad.vercel.app and the size of the post don't have an impact there meaning on slow machines, folks could potentially notice a small lag when clicking the "open inserter" button.

I tried to debug this using the Chrome tools, and I noticed that the biggest part of that time is spent on rendering the block types, there's just a lot of block types and the number grows with third-party blocks.

This PR uses a technique we previously used for the patterns list to make the inserter feel more responsive: render the inserter categories one by one, and then let the browser do more priority things (like actually opening the inserter) before continuing

Trace before this PR:
Screen Shot 2021-07-29 at 11 11 33 AM

Trace after the PR
Screen Shot 2021-07-29 at 11 12 17 AM

Notice that now the trace is split into smaller chunks which allows the browser to feel more responsive.

@youknowriad youknowriad added [Feature] Inserter The main way to insert blocks using the + button in the editing interface [Type] Performance Related to performance efforts labels Jul 29, 2021
@youknowriad youknowriad self-assigned this Jul 29, 2021
@youknowriad youknowriad requested a review from ellatrix as a code owner July 29, 2021 10:18
@github-actions
Copy link

github-actions bot commented Jul 29, 2021

Size Change: +566 B (0%)

Total Size: 1.08 MB

Filename Size Change
build/api-fetch/index.min.js 2.44 kB +1 B (0%)
build/block-editor/index.min.js 127 kB +76 B (0%)
build/block-editor/style-rtl.css 14 kB -4 B (0%)
build/block-editor/style.css 14 kB -3 B (0%)
build/block-library/blocks/template-part/editor-rtl.css 638 B +87 B (+16%) ⚠️
build/block-library/blocks/template-part/editor.css 637 B +87 B (+16%) ⚠️
build/block-library/editor-rtl.css 9.88 kB +51 B (+1%)
build/block-library/editor.css 9.88 kB +51 B (+1%)
build/block-library/index.min.js 147 kB +295 B (0%)
build/components/index.min.js 197 kB +14 B (0%)
build/core-data/index.min.js 12.6 kB +114 B (+1%)
build/edit-navigation/index.min.js 13.9 kB +3 B (0%)
build/edit-post/index.min.js 59.4 kB +2 B (0%)
build/editor/index.min.js 38.3 kB -207 B (-1%)
build/format-library/index.min.js 5.72 kB -1 B (0%)
build/server-side-render/index.min.js 1.64 kB +1 B (0%)
build/widgets/index.min.js 6.48 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 1.12 kB
build/admin-manifest/index.min.js 1.46 kB
build/annotations/index.min.js 2.93 kB
build/autop/index.min.js 2.28 kB
build/blob/index.min.js 673 B
build/block-directory/index.min.js 6.62 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 112 B
build/block-library/blocks/audio/style.css 112 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 475 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 603 B
build/block-library/blocks/button/style.css 602 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 375 B
build/block-library/blocks/buttons/style.css 375 B
build/block-library/blocks/calendar/style-rtl.css 208 B
build/block-library/blocks/calendar/style.css 208 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 190 B
build/block-library/blocks/columns/editor.css 190 B
build/block-library/blocks/columns/style-rtl.css 475 B
build/block-library/blocks/columns/style.css 476 B
build/block-library/blocks/cover/editor-rtl.css 670 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 486 B
build/block-library/blocks/embed/editor.css 486 B
build/block-library/blocks/embed/style-rtl.css 401 B
build/block-library/blocks/embed/style.css 400 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 301 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 711 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 704 B
build/block-library/blocks/gallery/editor.css 705 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB
build/block-library/blocks/gallery/style.css 1.06 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 160 B
build/block-library/blocks/group/editor.css 160 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 93 B
build/block-library/blocks/group/theme.css 93 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 281 B
build/block-library/blocks/html/editor.css 281 B
build/block-library/blocks/image/editor-rtl.css 729 B
build/block-library/blocks/image/editor.css 727 B
build/block-library/blocks/image/style-rtl.css 481 B
build/block-library/blocks/image/style.css 485 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 286 B
build/block-library/blocks/latest-comments/style.css 286 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 526 B
build/block-library/blocks/latest-posts/style.css 524 B
build/block-library/blocks/list/style-rtl.css 63 B
build/block-library/blocks/list/style.css 63 B
build/block-library/blocks/media-text/editor-rtl.css 263 B
build/block-library/blocks/media-text/editor.css 264 B
build/block-library/blocks/media-text/style-rtl.css 492 B
build/block-library/blocks/media-text/style.css 489 B
build/block-library/blocks/more/editor-rtl.css 434 B
build/block-library/blocks/more/editor.css 434 B
build/block-library/blocks/navigation-link/editor-rtl.css 474 B
build/block-library/blocks/navigation-link/editor.css 473 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation/editor-rtl.css 1.69 kB
build/block-library/blocks/navigation/editor.css 1.69 kB
build/block-library/blocks/navigation/style-rtl.css 1.65 kB
build/block-library/blocks/navigation/style.css 1.66 kB
build/block-library/blocks/navigation/view.min.js 2.84 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 310 B
build/block-library/blocks/page-list/editor.css 311 B
build/block-library/blocks/page-list/style-rtl.css 240 B
build/block-library/blocks/page-list/style.css 240 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 247 B
build/block-library/blocks/paragraph/style.css 248 B
build/block-library/blocks/post-author/editor-rtl.css 209 B
build/block-library/blocks/post-author/editor.css 209 B
build/block-library/blocks/post-author/style-rtl.css 183 B
build/block-library/blocks/post-author/style.css 184 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 139 B
build/block-library/blocks/post-content/editor.css 139 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B
build/block-library/blocks/post-featured-image/editor.css 338 B
build/block-library/blocks/post-featured-image/style-rtl.css 141 B
build/block-library/blocks/post-featured-image/style.css 141 B
build/block-library/blocks/post-template/editor-rtl.css 100 B
build/block-library/blocks/post-template/editor.css 99 B
build/block-library/blocks/post-template/style-rtl.css 379 B
build/block-library/blocks/post-template/style.css 380 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 362 B
build/block-library/blocks/pullquote/style.css 361 B
build/block-library/blocks/pullquote/theme-rtl.css 169 B
build/block-library/blocks/pullquote/theme.css 169 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 B
build/block-library/blocks/query-title/editor-rtl.css 86 B
build/block-library/blocks/query-title/editor.css 86 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 169 B
build/block-library/blocks/quote/style.css 169 B
build/block-library/blocks/quote/theme-rtl.css 221 B
build/block-library/blocks/quote/theme.css 221 B
build/block-library/blocks/rss/editor-rtl.css 201 B
build/block-library/blocks/rss/editor.css 202 B
build/block-library/blocks/rss/style-rtl.css 290 B
build/block-library/blocks/rss/style.css 290 B
build/block-library/blocks/search/editor-rtl.css 211 B
build/block-library/blocks/search/editor.css 211 B
build/block-library/blocks/search/style-rtl.css 372 B
build/block-library/blocks/search/style.css 373 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 251 B
build/block-library/blocks/separator/style.css 251 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 476 B
build/block-library/blocks/shortcode/editor.css 476 B
build/block-library/blocks/site-logo/editor-rtl.css 465 B
build/block-library/blocks/site-logo/editor.css 465 B
build/block-library/blocks/site-logo/style-rtl.css 154 B
build/block-library/blocks/site-logo/style.css 154 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/social-link/editor-rtl.css 164 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 800 B
build/block-library/blocks/social-links/editor.css 799 B
build/block-library/blocks/social-links/style-rtl.css 1.34 kB
build/block-library/blocks/social-links/style.css 1.34 kB
build/block-library/blocks/spacer/editor-rtl.css 308 B
build/block-library/blocks/spacer/editor.css 308 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 478 B
build/block-library/blocks/table/editor.css 478 B
build/block-library/blocks/table/style-rtl.css 480 B
build/block-library/blocks/table/style.css 480 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 569 B
build/block-library/blocks/video/editor.css 570 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 1.29 kB
build/block-library/common.css 1.29 kB
build/block-library/reset-rtl.css 514 B
build/block-library/reset.css 515 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 692 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.3 kB
build/block-serialization-spec-parser/index.min.js 3.06 kB
build/blocks/index.min.js 47.2 kB
build/components/style-rtl.css 15.9 kB
build/components/style.css 15.9 kB
build/compose/index.min.js 10.2 kB
build/customize-widgets/index.min.js 10.3 kB
build/customize-widgets/style-rtl.css 1.48 kB
build/customize-widgets/style.css 1.48 kB
build/data-controls/index.min.js 831 B
build/data/index.min.js 7.22 kB
build/date/index.min.js 31.8 kB
build/deprecated/index.min.js 738 B
build/dom-ready/index.min.js 576 B
build/dom/index.min.js 4.78 kB
build/edit-navigation/style-rtl.css 3.12 kB
build/edit-navigation/style.css 3.12 kB
build/edit-post/classic-rtl.css 483 B
build/edit-post/classic.css 483 B
build/edit-post/style-rtl.css 7.25 kB
build/edit-post/style.css 7.24 kB
build/edit-site/index.min.js 26 kB
build/edit-site/style-rtl.css 5.04 kB
build/edit-site/style.css 5.03 kB
build/edit-widgets/index.min.js 16.2 kB
build/edit-widgets/style-rtl.css 3.99 kB
build/edit-widgets/style.css 3.99 kB
build/editor/style-rtl.css 3.96 kB
build/editor/style.css 3.96 kB
build/element/index.min.js 3.44 kB
build/escape-html/index.min.js 739 B
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/hooks/index.min.js 1.76 kB
build/html-entities/index.min.js 628 B
build/i18n/index.min.js 3.73 kB
build/is-shallow-equal/index.min.js 710 B
build/keyboard-shortcuts/index.min.js 1.74 kB
build/keycodes/index.min.js 1.49 kB
build/list-reusable-blocks/index.min.js 2.07 kB
build/list-reusable-blocks/style-rtl.css 842 B
build/list-reusable-blocks/style.css 842 B
build/media-utils/index.min.js 3.08 kB
build/notices/index.min.js 1.07 kB
build/nux/index.min.js 2.31 kB
build/nux/style-rtl.css 745 B
build/nux/style.css 742 B
build/plugins/index.min.js 1.99 kB
build/primitives/index.min.js 1.06 kB
build/priority-queue/index.min.js 791 B
build/react-i18n/index.min.js 924 B
build/redux-routine/index.min.js 2.82 kB
build/reusable-blocks/index.min.js 2.56 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.8 kB
build/shortcode/index.min.js 1.68 kB
build/token-list/index.min.js 848 B
build/url/index.min.js 1.95 kB
build/viewport/index.min.js 1.28 kB
build/warning/index.min.js 1.16 kB
build/widgets/style-rtl.css 1.04 kB
build/widgets/style.css 1.05 kB
build/wordcount/index.min.js 1.24 kB

compressed-size-action

@youknowriad youknowriad force-pushed the perf/more-responsive-inserter branch from 229f166 to b970a7c Compare July 29, 2021 10:26
@gwwar
Copy link
Contributor

gwwar commented Jul 29, 2021

@youknowriad Which inserter were you testing with? Opening the global inserter from the top toolbar, I see:

Screen Shot 2021-07-29 at 1 27 24 PM

@youknowriad
Copy link
Contributor Author

@gwwar the global one, I didn't see that personally but I might still have some issues there, I'll look tomorrow.

@gwwar
Copy link
Contributor

gwwar commented Jul 29, 2021

Ideas

Profiling

So to verify that this is a hotspot in trunk, I did see ~300-400ms for the click handler. Our tasks should ideally be split into <16ms chunks, so we don't drop frames.

We can confirm this by running the profiler and toggling open the global inserter. If we dig into the call stack, we see that we go into React internals suggesting that there's too many nodes to render. This is confirmed when we profile in the react profiler. Some larger chunks I spotted in the react profiler look like they're coming from icons and enabling drag.

Dev tools - Too much to render React Profiler
Screen Shot 2021-07-29 at 1 38 37 PM Screen Shot 2021-07-29 at 1 55 51 PM

Also of note is that there's a layout shift for the skeleton + 3 animations that fire here. These won't be the cause of poor performance here, but we're adding some extra calculations on top of a slow spot. Might end up being a no-op, but these stood out.

Screen Shot 2021-07-29 at 1 45 02 PM

To see what animations are fired, we can use the animations tab:

animations.on.open.mp4

@youknowriad
Copy link
Contributor Author

It feels like there aren't a ton of items here to render without any plugins, but usually when we have too many things to render, common patterns would include paging/prioritizing items top of fold, then load in items lazily or via infinite scroll.

Yes, this is kind of similar to what this PR does but with some subtle differences:

  • Infinite scroll is not great a11y wise because screen readers don't have a notion of scroll meaning, they won't know that more things exist in a sense.
  • Pagination, this works but requires a design change and I'm not sure it's something we want to do.
  • The current PR lazy renders the list categories, one by one, without requiring scrolling, meaning if the user does something more prioritary like typing in an input or moving the mouse or anything, it will halt rendering of the block list until the browser becomes idle.

@youknowriad
Copy link
Contributor Author

It feels like there aren't a ton of items here to render without any plugins, but usually when we have too many things to render, common patterns would include paging/prioritizing items top of fold, then load in items lazily or via infinite scroll.

Yep, It does seem that there are components that are a bit slow to render maybe, the reason wasn't obvious to me while tracking but it something we can explore further.

@youknowriad
Copy link
Contributor Author

@gwwar I'm not able to reproduce your error above btw, do you think you can try to debug, or is there any instructions for me to try?

@youknowriad
Copy link
Contributor Author

It seems there's a browser specific issue, everything is working for me in safari but not in chrome 👀

@youknowriad
Copy link
Contributor Author

I think the Chrome rendering issues are now fixed with the last commit.

@youknowriad
Copy link
Contributor Author

youknowriad commented Jul 30, 2021

The inserter opening metric is three times quicker in this branch

(index) f4d54fa9466edbf57c96bba7b7ace9c4258107a8 trunk
load '6484.4 ms' '6397.2 ms'
type '34.69 ms' '35.58 ms'
minType '28.19 ms' '29.51 ms'
maxType '71.01 ms' '70.86 ms'
focus '123.27 ms' '76.64 ms'
minFocus '55.9 ms' '58.51 ms'
maxFocus '325.55 ms' '125.3 ms'
inserterOpen '114.89 ms' '336.8 ms'
minInserterOpen '74.95 ms' '240.72 ms'
maxInserterOpen '411.89 ms' '1041.57 ms'
inserterHover '22.36 ms' '23.39 ms'
minInserterHover '19.25 ms' '19.1 ms'
maxInserterHover '30.06 ms' '31.71 ms'

@youknowriad
Copy link
Contributor Author

I'm thinking of doing the same for search results on a separate PR. Right now, sometimes when typing the first characters in the search input, you do notice a small lag.

Copy link
Contributor

@gwwar gwwar left a comment

Choose a reason for hiding this comment

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

@youknowriad thanks for adding in the Chrome fix!

Do you mind checking the following in the profiler? I think I'm seeing the useAsyncList continue to queue up work after a single inserter open. In the videos below I left the react profiler highlighting on to demonstrate the issue.

trunk - see how it idles after open branch - why are we still doing work?
Screen Shot 2021-07-30 at 9 08 54 AM Screen Shot 2021-07-30 at 9 18 26 AM

How I'm profiling in trunk:

trunk.profiler.mp4

How I'm profiling in the branch:

branch.continues.to.do.work.mp4

The current PR lazy renders the list categories, one by one, without requiring scrolling

Right, I have no problems with breaking up the work. That makes a lot of sense when we have too much of it, I'm more curious about why it is as slow as it is with not a lot of items. It feels like it shouldn't be this slow for what looks like an icon and text. I'd be curious to 🔍 further investigate in follow up PRs:

  1. Why does it take so long to render a block type? Can we speed this up? (It looks like drag support + svg icons adds around 100ms, but there might be more to find for example, maybe we're using bad index keys for the list).
  2. Break up work in a sensible way. (this PR is one way of splitting this up and I think it's a good strategy to start with)
  3. With plugins do the number of items we need to render here grow unbounded? No matter how fast we can make a block type item render, if the number of types can grow to arbitrary sizes we'll eventually need/want to limit the number of items we should render. (windowing, just showing the top X, etc.)

// Ideally, we shouldn't use a timeout and instead check the browser is idle for
// a specific duration, but didn't manage to find a simple way to do that.
// eslint-disable-next-line no-restricted-syntax
await page.waitFor( 500 );
Copy link
Contributor

Choose a reason for hiding this comment

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

This is likely to be fragile. Perhaps split up the helper to fetch tiles for a specific section, or wait for all expected categories to appear instead of a wait.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

wait for all expected categories to appear instead of a wait.

This is exactly what I want to do here, but I didn't find a way to do it without introducing test specific code in the production code which I'm not a fan of.

@youknowriad
Copy link
Contributor Author

Do you mind checking the following in the profiler? I think I'm seeing the useAsyncList continue to queue up work after a single inserter open. In the videos below I left the react profiler highlighting on to demonstrate the issue.

Yes, that's intended, the browser stays responsive while the rendering of the remaining categories continues after the inserter is opened.

Why does it take so long to render a block type? Can we speed this up? (It looks like drag support + svg icons adds around 100ms, but there might be more to find for example, maybe we're using bad index keys for the list).

I can't tell but it's not 100ms for a single icon and drag support, it's for all the block types and there's a big number of them.

@gwwar
Copy link
Contributor

gwwar commented Jul 30, 2021

Yes, that's intended, the browser stays responsive while the rendering of the remaining categories continues after the inserter is opened.

I'm still seeing the browser do work after the inserter is fully rendered.

@youknowriad
Copy link
Contributor Author

I'm still seeing the browser do work after the inserter is fully rendered.

oh got it, that's not correct indeed, I'll check.

@youknowriad
Copy link
Contributor Author

It turns out the collections was not an array but a map and asyncList was kind of doing weird things with objects and only supports array, it's now fixed.

Copy link
Contributor

@gwwar gwwar left a comment

Choose a reason for hiding this comment

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

Giving tentative approval, let's wait for E2Es to be green. Some E2E specs may become more fragile from this change, but I think that's fine to address in follow ups provided that there aren't too many that are failing randomly.

This is a nice responsive speedup for the user, ~300ms -> 100 ms chunks on my machine. I think there's likely some more gains in shaving down the block type render, and splitting up work further so we can make sure tasks are closer to <16ms, but we can 🔍 in follow ups.

I'd also be curious to see if we have some research already with providing some a11y friendly ways of limiting what we render (like a simple load more button, or traditional pager).

✅ I also verified that I'm no longer seeing misc work firing after an inserter open.

Initial render now looks like 100-150ms chunks on my machine, with re-renders more around 90ms-100ms.

Screen Shot 2021-07-30 at 9 59 39 AM

@youknowriad
Copy link
Contributor Author

Giving tentative approval, let's wait for E2Es to be green. Some E2E specs may become more fragile from this change, but I think that's fine to address in follow ups provided that there aren't too many that are failing randomly.

yes, I just saw one instance of this which I fixed. I'm happy to monitor and fix these.

I'd also be curious to see if we have some research already with providing some a11y friendly ways of limiting what we render (like a simple load more button).

We didn't do extensive research which is worth it. My previous limited research saw that infinite scrolling and "more button" is potentially possible but would rarely be an ideal solution https://www.digitala11y.com/infinite-scroll-accessibility-is-it-any-good/ (initially we were thinking about virtual scrolling too for block content)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Inserter The main way to insert blocks using the + button in the editing interface [Type] Performance Related to performance efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants