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

Performance suite: track Time To First Byte in the front-end #47037

Merged
merged 13 commits into from
Jan 26, 2023

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Jan 10, 2023

closes #33645

What?

This PR aims to add the basic structure to have performance tests executed for the front-end, in addition to the existing test for post & site editor.

Why?

By defining some measures and track them over time, regressions will be caught up earlier in the cycle and there will be clarity about the impact of any given PR.

How?

The test measures two themes: TwentyTwentyOne as a classic theme and TwentyTwentyThree as a block theme. It loads the homepage of each with no posts. These gives use a baseline. In follow-ups, we can add more tests (load a specific post, etc.).

It reports the Time To First Byte, defined as the time it took since the browser requested the resource until the response started. It's reported as a median and as the 75th percentile.

Testing Instructions

Verify that the results for front-end test suite are reported in the Performance Test job:

image

TODO

  • Define the test to run. Load the homepage for pinned versions of 2021 (classic theme) and 2023 (block theme).
  • Verify config values for env: WP_DEBUG, SCRIPT_DEBUG, etc.
  • Create the JSON file with the results.
  • Show those results in the existing reporting mechanism.

Follow ups

  • Test a post page with dedicated content.
  • Make it visible in codehealth.
  • While tracking TTFB is useful, we need more granularity to know how the WordPress request lifecycle is affected by code changes. We can leverage the Server-Timing API to expose some server-side statistics in the client and track them via the existing tooling. For inspiration, we can look at incorporating something like this script.

@oandregal oandregal self-assigned this Jan 10, 2023
@oandregal oandregal added [Type] Build Tooling Issues or PRs related to build tooling [Type] Performance Related to performance efforts labels Jan 10, 2023
@oandregal oandregal added the [Status] In Progress Tracking issues with work in progress label Jan 10, 2023
@github-actions
Copy link

github-actions bot commented Jan 10, 2023

Size Change: +9.78 kB (+1%)

Total Size: 1.33 MB

Filename Size Change
build/blob/index.min.js 483 B -4 B (-1%)
build/block-editor/content-rtl.css 3.66 kB +703 B (+24%) 🚨
build/block-editor/content.css 3.66 kB +703 B (+24%) 🚨
build/block-editor/index.min.js 191 kB +7.57 kB (+4%)
build/block-editor/style-rtl.css 14.3 kB -205 B (-1%)
build/block-editor/style.css 14.3 kB -211 B (-1%)
build/block-library/blocks/rss/editor-rtl.css 149 B -53 B (-26%) 🎉
build/block-library/blocks/rss/editor.css 149 B -55 B (-27%) 🎉
build/block-library/blocks/table/editor-rtl.css 433 B -24 B (-5%)
build/block-library/blocks/table/editor.css 433 B -24 B (-5%)
build/block-library/editor-rtl.css 11.7 kB -35 B (0%)
build/block-library/editor.css 11.6 kB -37 B (0%)
build/block-library/index.min.js 200 kB +1.39 kB (+1%)
build/blocks/index.min.js 50.4 kB -5 B (0%)
build/components/index.min.js 203 kB +230 B (0%)
build/components/style-rtl.css 11.6 kB +8 B (0%)
build/components/style.css 11.7 kB +8 B (0%)
build/core-data/index.min.js 15.9 kB -15 B (0%)
build/customize-widgets/index.min.js 11.7 kB +2 B (0%)
build/data/index.min.js 7.95 kB +265 B (+3%)
build/edit-navigation/index.min.js 16.2 kB +6 B (0%)
build/edit-navigation/style-rtl.css 4.14 kB +25 B (+1%)
build/edit-navigation/style.css 4.15 kB +25 B (+1%)
build/edit-post/index.min.js 34.4 kB -234 B (-1%)
build/edit-post/style-rtl.css 7.46 kB +15 B (0%)
build/edit-post/style.css 7.45 kB +15 B (0%)
build/edit-site/index.min.js 63.4 kB -1.9 kB (-3%)
build/edit-site/style-rtl.css 9.52 kB +251 B (+3%)
build/edit-site/style.css 9.53 kB +257 B (+3%)
build/edit-widgets/index.min.js 16.8 kB +4 B (0%)
build/edit-widgets/style-rtl.css 4.49 kB +24 B (+1%)
build/edit-widgets/style.css 4.49 kB +25 B (+1%)
build/editor/index.min.js 45.2 kB +1.11 kB (+3%)
build/editor/style-rtl.css 3.68 kB -7 B (0%)
build/editor/style.css 3.67 kB -9 B (0%)
build/experiments/index.min.js 870 B -12 B (-1%)
build/list-reusable-blocks/index.min.js 2.14 kB +8 B (0%)
build/media-utils/index.min.js 2.99 kB +48 B (+2%)
build/priority-queue/index.min.js 1.52 kB -68 B (-4%)
build/reusable-blocks/index.min.js 2.27 kB +18 B (+1%)
build/reusable-blocks/style-rtl.css 265 B -18 B (-6%)
build/reusable-blocks/style.css 265 B -18 B (-6%)
build/url/index.min.js 3.69 kB -4 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/block-directory/index.min.js 7.16 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 84 B
build/block-library/blocks/avatar/style.css 84 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 353 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 829 B
build/block-library/blocks/image/editor.css 828 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
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 376 B
build/block-library/blocks/page-list/editor.css 376 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 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 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 440 B
build/block-library/blocks/query/editor.css 440 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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/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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 691 B
build/block-library/blocks/video/editor.css 694 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.4 kB
build/block-library/style.css 12.4 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 12.3 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.2 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.88 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Jan 10, 2023

Flaky tests detected in ebb4a1b.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4009066654
📝 Reported issues:

@oandregal
Copy link
Member Author

Define the test to run.

What page to load? I don't have a strong opinion. How a given template is set up or what template do we load would affect the test, though. In my PRs, I've been testing by loading a "Hello World" post using TwentyTwentyThree (block theme with theme.json) and TwentyTwenty (classic theme without theme.json). Any other ideas?

Who visits the page? I think we should test a logged-out user, as that's the real use case we want to improve (most of the visits to a given site are by logged-out users).

* @param {WPRawPerformanceResults} results
*
* @return {WPPerformanceResults} Curated Performance results.
*/
function curateResults( results ) {
function curateResults( testSuite, results ) {
if ( testSuite === 'front-end' ) {
Copy link
Member Author

@oandregal oandregal Jan 11, 2023

Choose a reason for hiding this comment

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

The WPPerformanceResults and WPRawPerformanceResults data structures expect the results to be the same shape. The front-end metrics will be different from the editor ones, so this will no longer be true. I'm not very keen of stretching it this way, though it's simple and works. See c647035

An alternative I considered was to make the tests themselves return a single value. The test would be responsible for curating the value it wants to report, not the performance command. I'm tempted to do it. The only benefit of having an array of values here would be to aggregate them all across the different runs, which is something we don't do at the moment anyway. FWIW, we only do 1 run at the moment (though we did 3 in the past).

Copy link
Member Author

Choose a reason for hiding this comment

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

Another advantage of asking the test to curate the results themselves is that adding a new metric doesn't involve modifying the performance command, only the test itself.

},
median
);
/**
Copy link
Member Author

Choose a reason for hiding this comment

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

This change is just a way of making the command independent from the test suite data points. 859e453

*/
import { activateTheme, createURL, logout } from '@wordpress/e2e-test-utils';

describe( 'Front End Performance', () => {
Copy link
Member Author

@oandregal oandregal Jan 11, 2023

Choose a reason for hiding this comment

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

Adding separate files per theme makes it simple with the way the performance report is set up.

I considered an alternative: having a single test for all themes and keys such as timeToFirstByteTT1, timeToFirstByteTT3, etc. That could also work. The performance command could even have some code to extract those keys into separate tables. However, at that point, the performance command is not independent from the actual tests and data. I thought the current approach was simpler to understand and navigate.

);
const [ navigationTiming ] = JSON.parse( navigationTimingJson );
results.timeToFirstByte.push(
navigationTiming.responseStart - navigationTiming.requestStart
Copy link
Member

Choose a reason for hiding this comment

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

TTFB, by definition, is the time from startTime to responseStart. I guess we can just do responseStart here? Or should we use a different metric or a different name?

Copy link
Member

Choose a reason for hiding this comment

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

Update: We should change the name to something like requestTime. And maybe also include TTFB additionally if needed.

Copy link
Member Author

Choose a reason for hiding this comment

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

@kevin940726
Copy link
Member

Some updates on what we could do next:

  1. We should rename the currently incorrectly named TTFB to something like serverResponse or requestTime. We can also still collect TTFB additionally though.
  2. We should also test the post page. We might want to create a dedicated post for this test in the future. How long or complicated the post should be is still undecided yet though.
  3. We would want to pin the theme to a specific version so that future releases won't affect the data we collect. One idea is to fetch the themes on CI with a certain version hash.

} );

it( 'Time To First Byte (TTFB)', async () => {
let i = 10;
Copy link
Member

Choose a reason for hiding this comment

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

Any reason why we're testing it 10 times here but only 5 times in TT1?

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 for the catch! Modified both to use 16 runs. The reason for choosing 16 is that calculating the 75th percentile means that we discard the 4 worse results, which gives us some room for avoiding out of the ordinary platform-specific numbers. 12 could also do: 9 is the 75th percentile, so we'd discard the worse 3 results.

Comment on lines 362 to 363
'front-end-twentytwentyone',
'front-end-twentytwentythree',
Copy link
Member

Choose a reason for hiding this comment

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

I wonder if it makes sense to change these names into more semantic ones. Like front-end-classic-theme and front-end-block-theme?

@mikachan
Copy link
Member

We would want to pin the theme to a specific version so that future releases won't affect the data we collect. One idea is to fetch the themes on CI with a certain version hash.

I've attempted this in dfbff02, waiting for the tests to run to see if this works...

@oandregal
Copy link
Member Author

We should rename the currently incorrectly named TTFB to something like serverResponse or requestTime. We can also still collect TTFB additionally though.

Pushed changes to clarify this: it reports the TTFB as median and as 75th percentile.

I'd be interested in adding specific timings for the server, that's why I thought of using responseStart-requestStart. However, it sounds like using an approach like this could be more interesting, and it'll help us to add more WordPress specific hooks as desired. So thought we should stick to TTFB for the moment.

@oandregal
Copy link
Member Author

Verify config values for env: WP_DEBUG, SCRIPT_DEBUG, etc.

Where can I find the wp-env configuration for CI? I want to make sure the values we use for those variables in this test and production like (false, essentially).

@oandregal oandregal removed the [Status] In Progress Tracking issues with work in progress label Jan 25, 2023
@oandregal
Copy link
Member Author

We should also test the post page. We might want to create a dedicated post for this test in the future. How long or complicated the post should be is still undecided yet though.

I'm interested in shipping a first version of this test. We can do this in a follow-up.

@oandregal oandregal marked this pull request as ready for review January 25, 2023 19:26
run: |
npm run wp-env start
npm run wp-env -- run tests-cli "wp theme update twentytwentyone --version=1.7"
npm run wp-env -- run tests-cli "wp theme update twentytwentythree --version=1.0"
Copy link
Contributor

Choose a reason for hiding this comment

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

Will these downgrade the theme if it has a more recent version?

Copy link
Member

Choose a reason for hiding this comment

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

Yes, the idea was to keep the theme version consistent across the tests so the themes couldn't influence the results. It's unlikely, but I think it's still good to keep things as consistent as possible.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yeah. The rationale for this is to be able to control the environment so that only the Gutenberg PR affects the metrics. At some point, we should manually update the themes, but at least this will be an intentional change and won't affect any unrelated PR.

@mikachan
Copy link
Member

Where can I find the wp-env configuration for CI?

If they're not being modified anywhere, I assume we're using the default values, which are described here in the docs. It looks like they're set to true on the development instance, and false on the test instance.

@oandregal oandregal merged commit e5b286f into trunk Jan 26, 2023
@oandregal oandregal deleted the add/front-end-performance-test branch January 26, 2023 09:17
@github-actions github-actions bot added this to the Gutenberg 15.1 milestone Jan 26, 2023
@oandregal oandregal changed the title Add skeleton for front-end performance tests Performance suite: track Time To First Byte in the front-end Jan 26, 2023
Comment on lines +38 to +41
const navigationTimingJson = await page.evaluate( () =>
JSON.stringify( performance.getEntriesByType( 'navigation' ) )
);
const [ navigationTiming ] = JSON.parse( navigationTimingJson );
Copy link
Member

Choose a reason for hiding this comment

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

Nit:

evaluate should automatically serialize/deserialize JSON data, so we should be able to just do:

const [ navigationTimeing ] = await page.evaluate( () =>
  performance.getEntriesByType( 'navigation' )
);

In addition, we already have some performance utils available, and this probably belongs in the getLoadingDurations util. WDYT?

Copy link
Member Author

Choose a reason for hiding this comment

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

👍

Copy link
Member Author

Choose a reason for hiding this comment

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

@oandregal
Copy link
Member Author

Follow-up for LCP at #47938

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Build Tooling Issues or PRs related to build tooling [Type] Performance Related to performance efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add frontend rendering metrics in the performance tests.
4 participants