Disable lazy loading on search on web#90517
Conversation
|
🚧 @luacmartins has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
ManualNavigateToReports Span SummaryThe data shows 10 trials per build. Each trial consists of 1 cold navigation (first entry into Reports) followed by 2 warm navigations (subsequent visits). The cold/warm split is clearly visible: cold runs are ~30–60× slower than warm ones. Note: Ad hoc build (
|
| Trial | Duration (ms) |
|---|---|
| 1 | 1217 |
| 2 | 1344 |
| 3 | 1375 |
| 4 | 1322 |
| 5 | 1300 |
| 6 | 1404 |
| 7 | 1385 |
| 8 | 1488 |
| 9 | 1373 |
| 10 | 1029 |
- Avg: 1323.7 ms
- Min / Max: 1029 / 1488 ms
Warm navigation (2nd & 3rd visits)
- Samples: 20
- Avg: 39.1 ms
- Min / Max: 23 / 43 ms
Prod build (vendors-51ebbb0f262077a56ed2)
Cold navigation (1st visit)
| Trial | Duration (ms) |
|---|---|
| 1 | 1592 |
| 2 | 2117 |
| 3 | 1644 |
| 4 | 1603 |
| 5 | 1794 |
| 6 | 1571 |
| 7 | 1685 |
| 8 | 1881 |
| 9 | 1528 |
| 10 | 1580 |
- Avg: 1699.5 ms
- Min / Max: 1528 / 2117 ms
Warm navigation (2nd & 3rd visits)
- Samples: 20
- Avg: 32.7 ms
- Min / Max: 29 / 38 ms
Head-to-head
| Metric | Ad hoc | Prod | Δ (Prod − Ad hoc) |
|---|---|---|---|
| Cold avg | 1323.7 ms | 1699.5 ms | +375.8 ms (+28.4%) |
| Cold min | 1029 ms | 1528 ms | +499 ms |
| Cold max | 1488 ms | 2117 ms | +629 ms |
| Warm avg | 39.1 ms | 32.7 ms | −6.4 ms (−16.3%) |
| Warm min | 23 ms | 29 ms | +6 ms |
| Warm max | 43 ms | 38 ms | −5 ms |
Takeaways
- Cold path regresses on Prod by ~376 ms on average (~28% slower). Prod's worst cold run hit 2.1 s vs. Ad hoc's worst at 1.5 s.
- Warm path is slightly faster on Prod (~6 ms / 16%), and notably more consistent (range 29–38 ms vs. 23–43 ms).
- Warm timings are tight enough (~30–40 ms) that the cost is dominated by something amortized on first navigation — likely module/init work or first-render data shaping that isn't repeated on subsequent visits.
Sample test
Screen.Recording.2026-05-14.at.17.47.45.mov
Data
Ad hoc
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1217ms) {spanId: 'ManualNavigateToReports', durationMs: 1217, timestamp: 10373, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (40ms) {spanId: 'ManualNavigateToReports', durationMs: 40, timestamp: 13255.800000000745, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (38ms) {spanId: 'ManualNavigateToReports', durationMs: 38, timestamp: 17160.60000000056, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1344ms) {spanId: 'ManualNavigateToReports', durationMs: 1344, timestamp: 42831.700000000186, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (40ms) {spanId: 'ManualNavigateToReports', durationMs: 40, timestamp: 45504.89999999944, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (39ms) {spanId: 'ManualNavigateToReports', durationMs: 39, timestamp: 47767.799999999814, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1375ms) {spanId: 'ManualNavigateToReports', durationMs: 1375, timestamp: 19964.599999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (41ms) {spanId: 'ManualNavigateToReports', durationMs: 41, timestamp: 23215.89999999944, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (39ms) {spanId: 'ManualNavigateToReports', durationMs: 39, timestamp: 25697.299999999814, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1322ms) {spanId: 'ManualNavigateToReports', durationMs: 1322, timestamp: 11659.899999999441, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (39ms) {spanId: 'ManualNavigateToReports', durationMs: 39, timestamp: 14543.099999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (41ms) {spanId: 'ManualNavigateToReports', durationMs: 41, timestamp: 17512.599999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1300ms) {spanId: 'ManualNavigateToReports', durationMs: 1300, timestamp: 19169.89999999944, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (39ms) {spanId: 'ManualNavigateToReports', durationMs: 39, timestamp: 21860.099999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (40ms) {spanId: 'ManualNavigateToReports', durationMs: 40, timestamp: 23908.599999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1404ms) {spanId: 'ManualNavigateToReports', durationMs: 1404, timestamp: 42983.10000000056, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (42ms) {spanId: 'ManualNavigateToReports', durationMs: 42, timestamp: 46205.10000000056, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (34ms) {spanId: 'ManualNavigateToReports', durationMs: 34, timestamp: 51818.60000000056, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1385ms) {spanId: 'ManualNavigateToReports', durationMs: 1385, timestamp: 23121.5, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (41ms) {spanId: 'ManualNavigateToReports', durationMs: 41, timestamp: 25704.599999999627, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (38ms) {spanId: 'ManualNavigateToReports', durationMs: 38, timestamp: 28590.799999999814, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1488ms) {spanId: 'ManualNavigateToReports', durationMs: 1488, timestamp: 15907.699999999255, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (42ms) {spanId: 'ManualNavigateToReports', durationMs: 42, timestamp: 18613.199999999255, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (39ms) {spanId: 'ManualNavigateToReports', durationMs: 39, timestamp: 21710.199999999255, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1373ms) {spanId: 'ManualNavigateToReports', durationMs: 1373, timestamp: 37331.5, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (23ms) {spanId: 'ManualNavigateToReports', durationMs: 23, timestamp: 39860.5, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (43ms) {spanId: 'ManualNavigateToReports', durationMs: 43, timestamp: 44053.300000000745, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1029ms) {spanId: 'ManualNavigateToReports', durationMs: 1029, timestamp: 10203.5, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (41ms) {spanId: 'ManualNavigateToReports', durationMs: 41, timestamp: 13319.800000000745, attributes: {…}}
vendors-359697571784f55a01db.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (42ms) {spanId: 'ManualNavigateToReports', durationMs: 42, timestamp: 16337.800000000745, attributes: {…}}
Prod
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1592ms) {spanId: 'ManualNavigateToReports', durationMs: 1592, timestamp: 32523.599999999627, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 34855.5, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (32ms) {spanId: 'ManualNavigateToReports', durationMs: 32, timestamp: 37189.09999999963, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (2117ms) {spanId: 'ManualNavigateToReports', durationMs: 2117, timestamp: 27153.700000000186, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 29787, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (38ms) {spanId: 'ManualNavigateToReports', durationMs: 38, timestamp: 32494.299999999814, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1644ms) {spanId: 'ManualNavigateToReports', durationMs: 1644, timestamp: 34116.299999999814, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (32ms) {spanId: 'ManualNavigateToReports', durationMs: 32, timestamp: 36671.40000000037, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (31ms) {spanId: 'ManualNavigateToReports', durationMs: 31, timestamp: 39186.700000000186, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1603ms) {spanId: 'ManualNavigateToReports', durationMs: 1603, timestamp: 24408.10000000056, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (30ms) {spanId: 'ManualNavigateToReports', durationMs: 30, timestamp: 26818.200000000186, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (35ms) {spanId: 'ManualNavigateToReports', durationMs: 35, timestamp: 30045, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1794ms) {spanId: 'ManualNavigateToReports', durationMs: 1794, timestamp: 39263.799999999814, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 42103.39999999944, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 44618.09999999963, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1571ms) {spanId: 'ManualNavigateToReports', durationMs: 1571, timestamp: 17508.60000000056, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (30ms) {spanId: 'ManualNavigateToReports', durationMs: 30, timestamp: 20304.800000000745, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (31ms) {spanId: 'ManualNavigateToReports', durationMs: 31, timestamp: 22918.10000000056, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1685ms) {spanId: 'ManualNavigateToReports', durationMs: 1685, timestamp: 13125.800000000745, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (32ms) {spanId: 'ManualNavigateToReports', durationMs: 32, timestamp: 15622.900000000373, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (32ms) {spanId: 'ManualNavigateToReports', durationMs: 32, timestamp: 17939.900000000373, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1881ms) {spanId: 'ManualNavigateToReports', durationMs: 1881, timestamp: 23241.799999999814, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (32ms) {spanId: 'ManualNavigateToReports', durationMs: 32, timestamp: 25671.60000000056, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (34ms) {spanId: 'ManualNavigateToReports', durationMs: 34, timestamp: 27658.10000000056, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1528ms) {spanId: 'ManualNavigateToReports', durationMs: 1528, timestamp: 27996, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 33119.20000000112, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (37ms) {spanId: 'ManualNavigateToReports', durationMs: 37, timestamp: 35056.20000000112, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (1580ms) {spanId: 'ManualNavigateToReports', durationMs: 1580, timestamp: 34943.199999999255, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (33ms) {spanId: 'ManualNavigateToReports', durationMs: 33, timestamp: 37528.5, attributes: {…}}
vendors-51ebbb0f262077a56ed2.bundle.js:23 [Sentry][ManualNavigateToReports] Ending span (29ms) {spanId: 'ManualNavigateToReports', durationMs: 29, timestamp: 39903.89999999851, attributes: {…}}
| import CONST from '@src/CONST'; | ||
| import NAVIGATORS from '@src/NAVIGATORS'; | ||
| import SCREENS from '@src/SCREENS'; | ||
| // Were not lazy loading SearchFullscreenNavigator, due to over 50% users visiting it only once during session. |
There was a problem hiding this comment.
| // Were not lazy loading SearchFullscreenNavigator, due to over 50% users visiting it only once during session. | |
| // Do not lazy load Search navigator for performance reasons |
|
@youssef-lr Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@codex review |
|
LGTM 🚀 |
|
Codex Review: Didn't find any major issues. Delightful! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppIMG_2305.MP4Android: mWeb ChromeIMG_2304.MP4iOS: HybridAppIMG_2305.MP4iOS: mWeb SafariIMG_2304.MP4MacOS: Chrome / Safari2026-05-15.11.56.06.mov |
|
LGTM! |
|
PR doesn’t need product input as a perf PR. Unassigning and unsubscribing myself. |
|
🚧 @mountiny has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/mountiny in version: 9.3.76-0 🚀
|
|
No help site changes are required. This PR is a purely internal performance optimization (removing lazy loading from |
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.3.77-3 🚀
|
Explanation of Change
This PR removes lazy load from
SearchFullscreenNavigatorScreendue to performance reasons. More details in the comment below.Fixed Issues
$ #90758
PROPOSAL:
Slack convo
Tests
HomeSpendOffline tests
Same as tests
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Changes only affect web
MacOS: Chrome / Safari
Screen.Recording.2026-05-14.at.17.47.45.mov