perf(gpu): retain deferred image masks - #754
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #754 +/- ##
=======================================
Coverage 90.01% 90.01%
=======================================
Files 320 320
Lines 68975 68975
=======================================
Hits 62088 62088
Misses 6887 6887
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
Flutter GPU performanceAutomated on macOS Metal for commit macOS Metal GPU comparison with
|
| Signal | Main | PR | Change |
|---|---|---|---|
Scenario gpu-deferred-mask-page-0-canvas-tile elapsed p50 |
42.0 ms | 29.0 ms | within run spread |
Scenario gpu-deferred-mask-page-0-first-tile elapsed p50 |
477.0 ms | 186.0 ms | within run spread |
Scenario gpu-radial-page-0-canvas-tile elapsed p50 |
935.0 ms | 971.0 ms | within run spread |
Scenario gpu-radial-page-0-first-tile elapsed p50 |
38.0 ms | 33.0 ms | within run spread |
Scenario gpu-radial-page-0-scene-warm elapsed p50 |
633.0 ms | 818.0 ms | within run spread |
Scenario gpu-radial-pipeline-warm elapsed p50 |
412.0 ms | 363.0 ms | within run spread |
Scenario gpu-tiling-page-0-canvas-tile elapsed p50 |
677.0 ms | 722.0 ms | within run spread |
Scenario gpu-tiling-page-0-first-tile elapsed p50 |
14.0 ms | 20.0 ms | within run spread |
Scenario gpu-tiling-page-0-scene-warm elapsed p50 |
313.0 ms | 359.0 ms | within run spread |
Scenario gpu-tiling-pipeline-warm elapsed p50 |
366.0 ms | 406.0 ms | within run spread |
| Jank total p95 | 522.3 ms | 416.9 ms | -20.2% |
| Raster p95 | 861.8 ms | 1091.7 ms | +26.7% |
| Jank frames | 4 | 2 | -2 |
| Reconcile fallbacks | 0 | 0 | — |
| Page-raster rejects | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
View Flutter GPU performance details
Patrol macOS Metal GPU performance
Observational trace from the real Patrol device journey. Use it for PR comparisons; wall-clock values are not a CI gate.
| Signal | Result |
|---|---|
| Build | commit=c534c87b814c6736b7e91748b26a654149af3013 |
| Journey segments | 18 |
| Perf events | 404 |
| Trace span | 34483.0 ms |
| Jank frames | 2 |
| Jank total p50 / p95 / max | 416.9 ms / 416.9 ms / 416.9 ms |
| Reconcile p50 / p95 / max | n/a |
| Reconcile modes | none |
| Reconcile fallbacks | none |
| Thumbnail paths | none |
| Page-raster outcomes | none |
| Web-worker outcomes | none |
| Worker phase requests | 0 |
| Worker total p50 / p95 / max | n/a |
| Worker decode p50 / p95 / max | n/a |
| Worker image-cache peak | n/a |
| Worker image-cache lookups | 0 hit / 0 miss (n/a) |
| Worker image-cache request paths | 0 reuse / 0 miss-only / 0 no-lookup |
| Worker image-cache net growth | 0 entries / 0 B |
| Scenarios | gpu-deferred-mask-page-0-canvas-tile:start 6, gpu-deferred-mask-page-0-canvas-tile:validated 6, gpu-deferred-mask-page-0-first-tile:start 6, gpu-deferred-mask-page-0-first-tile:validated 6, gpu-radial-page-0-canvas-tile:start 6, gpu-radial-page-0-canvas-tile:validated 6, gpu-radial-page-0-first-tile:start 6, gpu-radial-page-0-first-tile:validated 6, gpu-radial-page-0-scene-warm:start 6, gpu-radial-page-0-scene-warm:validated 6, gpu-radial-pipeline-warm:start 6, gpu-radial-pipeline-warm:validated 6, gpu-tiling-page-0-canvas-tile:start 6, gpu-tiling-page-0-canvas-tile:validated 6, gpu-tiling-page-0-first-tile:start 6, gpu-tiling-page-0-first-tile:validated 6, gpu-tiling-page-0-scene-warm:start 6, gpu-tiling-page-0-scene-warm:validated 6, gpu-tiling-pipeline-warm:start 6, gpu-tiling-pipeline-warm:validated 6 |
| Raster p50 / p95 / max | 337.2 ms / 1091.7 ms / 1307.5 ms |
| Tile replay requests | 0 |
| Tile replay p50 / p95 / max | n/a |
| Tile replay raster p50 / p95 / max | n/a |
| Tile slice classes | none |
| Tile rung/class batches | none |
| Tile retained peak | n/a |
Scenario breakdown
| Scenario | Runs | Elapsed p50 / p95 / max | Jank p95 | Reconcile p95 | Raster p95 | Worker total p95 | Decode p95 | Tile replay / prefetch batches | Tile retained peak | Cache lookups | Image cache peak | Worker outcomes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
gpu-deferred-mask-page-0-canvas-tile |
6 | 29.0 ms / 126.0 ms / 126.0 ms | n/a | n/a | 125.0 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-deferred-mask-page-0-first-tile |
6 | 186.0 ms / 591.0 ms / 591.0 ms | n/a | n/a | 589.7 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-radial-page-0-canvas-tile |
6 | 971.0 ms / 1309.0 ms / 1309.0 ms | n/a | n/a | 1307.5 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-radial-page-0-first-tile |
6 | 33.0 ms / 215.0 ms / 215.0 ms | n/a | n/a | 213.4 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-radial-page-0-scene-warm |
6 | 818.0 ms / 1124.0 ms / 1124.0 ms | n/a | n/a | 1123.5 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-radial-pipeline-warm |
6 | 363.0 ms / 438.0 ms / 438.0 ms | n/a | n/a | 436.2 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-tiling-page-0-canvas-tile |
6 | 722.0 ms / 1093.0 ms / 1093.0 ms | n/a | n/a | 1091.7 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-tiling-page-0-first-tile |
6 | 20.0 ms / 74.0 ms / 74.0 ms | n/a | n/a | 71.9 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-tiling-page-0-scene-warm |
6 | 359.0 ms / 701.0 ms / 701.0 ms | 416.9 ms | n/a | 700.6 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
gpu-tiling-pipeline-warm |
6 | 406.0 ms / 468.0 ms / 468.0 ms | n/a | n/a | 466.5 ms | n/a | n/a | 0 / 0 | n/a | 0 hit / 0 miss (n/a) | n/a | none |
Artifacts: patrol-perf.log (normalized raw trace), patrol-perf.json (machine comparison), patrol-perf-headline.md (visible PR headline), and this full Markdown summary.
Patrol macOS Metal GPU comparison with main
Advisory only: timing changes do not fail CI. The baseline is the newest usable macOS Metal GPU artifact from Patrol E2E on main.
Scenario elapsed p50 changes are labelled within run spread when both cohorts have at least four samples and their interquartile ranges overlap.
| Signal | Main | PR | Change |
|---|---|---|---|
| Journey segments | 18 | 18 | — |
| Perf events | 382 | 404 | +22 |
| Jank frames | 4 | 2 | -2 |
| Jank total p95 | 522.3 ms | 416.9 ms | -20.2% |
| Reconcile p95 | n/a | n/a | n/a |
| Reconcile fallbacks | 0 | 0 | — |
| Thumbnail preview hits | 0 | 0 | — |
| Page-raster rejects | 0 | 0 | — |
| Web-worker ready | n/a | n/a | n/a |
| Web-worker null starts | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
| Worker phase requests | 0 | 0 | — |
| Worker phase total p95 | n/a | n/a | n/a |
| Worker decode p95 | n/a | n/a | n/a |
| Raster p95 | 861.8 ms | 1091.7 ms | +26.7% |
| Tile replay requests | 0 | 0 | — |
| Tile prefetch batches | n/a | n/a | n/a |
| Tile prefetch tiles | n/a | n/a | n/a |
| Tile replay p95 | n/a | n/a | n/a |
| Tile replay raster p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-canvas-tile runs | 6 | 6 | — |
| Scenario gpu-deferred-mask-page-0-canvas-tile elapsed p50 | 42.0 ms | 29.0 ms | within run spread |
| Scenario gpu-deferred-mask-page-0-canvas-tile elapsed p95 | 101.0 ms | 126.0 ms | +24.8% |
| Scenario gpu-deferred-mask-page-0-canvas-tile jank p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-canvas-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-canvas-tile raster p95 | 100.2 ms | 125.0 ms | +24.8% |
| Scenario gpu-deferred-mask-page-0-canvas-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-canvas-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-canvas-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-deferred-mask-page-0-canvas-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-first-tile runs | 6 | 6 | — |
| Scenario gpu-deferred-mask-page-0-first-tile elapsed p50 | 477.0 ms | 186.0 ms | within run spread |
| Scenario gpu-deferred-mask-page-0-first-tile elapsed p95 | 487.0 ms | 591.0 ms | +21.4% |
| Scenario gpu-deferred-mask-page-0-first-tile jank p95 | 522.3 ms | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-first-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-first-tile raster p95 | 484.8 ms | 589.7 ms | +21.6% |
| Scenario gpu-deferred-mask-page-0-first-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-first-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-deferred-mask-page-0-first-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-deferred-mask-page-0-first-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-canvas-tile runs | 6 | 6 | — |
| Scenario gpu-radial-page-0-canvas-tile elapsed p50 | 935.0 ms | 971.0 ms | within run spread |
| Scenario gpu-radial-page-0-canvas-tile elapsed p95 | 1162.0 ms | 1309.0 ms | +12.7% |
| Scenario gpu-radial-page-0-canvas-tile jank p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-canvas-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-canvas-tile raster p95 | 1161.3 ms | 1307.5 ms | +12.6% |
| Scenario gpu-radial-page-0-canvas-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-canvas-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-canvas-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-radial-page-0-canvas-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-first-tile runs | 6 | 6 | — |
| Scenario gpu-radial-page-0-first-tile elapsed p50 | 38.0 ms | 33.0 ms | within run spread |
| Scenario gpu-radial-page-0-first-tile elapsed p95 | 130.0 ms | 215.0 ms | +65.4% |
| Scenario gpu-radial-page-0-first-tile jank p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-first-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-first-tile raster p95 | 128.7 ms | 213.4 ms | +65.8% |
| Scenario gpu-radial-page-0-first-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-first-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-first-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-radial-page-0-first-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-scene-warm runs | 6 | 6 | — |
| Scenario gpu-radial-page-0-scene-warm elapsed p50 | 633.0 ms | 818.0 ms | within run spread |
| Scenario gpu-radial-page-0-scene-warm elapsed p95 | 768.0 ms | 1124.0 ms | +46.4% |
| Scenario gpu-radial-page-0-scene-warm jank p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-scene-warm reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-scene-warm raster p95 | 767.7 ms | 1123.5 ms | +46.4% |
| Scenario gpu-radial-page-0-scene-warm worker total p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-scene-warm decode p95 | n/a | n/a | n/a |
| Scenario gpu-radial-page-0-scene-warm tile replay requests | 0 | 0 | — |
| Scenario gpu-radial-page-0-scene-warm tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-radial-pipeline-warm runs | 6 | 6 | — |
| Scenario gpu-radial-pipeline-warm elapsed p50 | 412.0 ms | 363.0 ms | within run spread |
| Scenario gpu-radial-pipeline-warm elapsed p95 | 501.0 ms | 438.0 ms | -12.6% |
| Scenario gpu-radial-pipeline-warm jank p95 | n/a | n/a | n/a |
| Scenario gpu-radial-pipeline-warm reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-radial-pipeline-warm raster p95 | 500.2 ms | 436.2 ms | -12.8% |
| Scenario gpu-radial-pipeline-warm worker total p95 | n/a | n/a | n/a |
| Scenario gpu-radial-pipeline-warm decode p95 | n/a | n/a | n/a |
| Scenario gpu-radial-pipeline-warm tile replay requests | 0 | 0 | — |
| Scenario gpu-radial-pipeline-warm tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-canvas-tile runs | 6 | 6 | — |
| Scenario gpu-tiling-page-0-canvas-tile elapsed p50 | 677.0 ms | 722.0 ms | within run spread |
| Scenario gpu-tiling-page-0-canvas-tile elapsed p95 | 729.0 ms | 1093.0 ms | +49.9% |
| Scenario gpu-tiling-page-0-canvas-tile jank p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-canvas-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-canvas-tile raster p95 | 727.9 ms | 1091.7 ms | +50.0% |
| Scenario gpu-tiling-page-0-canvas-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-canvas-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-canvas-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-tiling-page-0-canvas-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-first-tile runs | 6 | 6 | — |
| Scenario gpu-tiling-page-0-first-tile elapsed p50 | 14.0 ms | 20.0 ms | within run spread |
| Scenario gpu-tiling-page-0-first-tile elapsed p95 | 21.0 ms | 74.0 ms | +252.4% |
| Scenario gpu-tiling-page-0-first-tile jank p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-first-tile reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-first-tile raster p95 | 20.3 ms | 71.9 ms | +254.1% |
| Scenario gpu-tiling-page-0-first-tile worker total p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-first-tile decode p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-first-tile tile replay requests | 0 | 0 | — |
| Scenario gpu-tiling-page-0-first-tile tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-scene-warm runs | 6 | 6 | — |
| Scenario gpu-tiling-page-0-scene-warm elapsed p50 | 313.0 ms | 359.0 ms | within run spread |
| Scenario gpu-tiling-page-0-scene-warm elapsed p95 | 318.0 ms | 701.0 ms | +120.4% |
| Scenario gpu-tiling-page-0-scene-warm jank p95 | 440.9 ms | 416.9 ms | -5.4% |
| Scenario gpu-tiling-page-0-scene-warm reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-scene-warm raster p95 | 317.3 ms | 700.6 ms | +120.8% |
| Scenario gpu-tiling-page-0-scene-warm worker total p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-scene-warm decode p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-page-0-scene-warm tile replay requests | 0 | 0 | — |
| Scenario gpu-tiling-page-0-scene-warm tile prefetch batches | n/a | n/a | n/a |
| Scenario gpu-tiling-pipeline-warm runs | 6 | 6 | — |
| Scenario gpu-tiling-pipeline-warm elapsed p50 | 366.0 ms | 406.0 ms | within run spread |
| Scenario gpu-tiling-pipeline-warm elapsed p95 | 423.0 ms | 468.0 ms | +10.6% |
| Scenario gpu-tiling-pipeline-warm jank p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-pipeline-warm reconcile p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-pipeline-warm raster p95 | 421.4 ms | 466.5 ms | +10.7% |
| Scenario gpu-tiling-pipeline-warm worker total p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-pipeline-warm decode p95 | n/a | n/a | n/a |
| Scenario gpu-tiling-pipeline-warm tile replay requests | 0 | 0 | — |
| Scenario gpu-tiling-pipeline-warm tile prefetch batches | n/a | n/a | n/a |
| Structural signal | Main | PR |
|---|---|---|
| Scenarios | gpu-deferred-mask-page-0-canvas-tile:start 6, gpu-deferred-mask-page-0-canvas-tile:validated 6, gpu-deferred-mask-page-0-first-tile:start 6, gpu-deferred-mask-page-0-first-tile:validated 6, gpu-radial-page-0-canvas-tile:start 6, gpu-radial-page-0-canvas-tile:validated 6, gpu-radial-page-0-first-tile:start 6, gpu-radial-page-0-first-tile:validated 6, gpu-radial-page-0-scene-warm:start 6, gpu-radial-page-0-scene-warm:validated 6, gpu-radial-pipeline-warm:start 6, gpu-radial-pipeline-warm:validated 6, gpu-tiling-page-0-canvas-tile:start 6, gpu-tiling-page-0-canvas-tile:validated 6, gpu-tiling-page-0-first-tile:start 6, gpu-tiling-page-0-first-tile:validated 6, gpu-tiling-page-0-scene-warm:start 6, gpu-tiling-page-0-scene-warm:validated 6, gpu-tiling-pipeline-warm:start 6, gpu-tiling-pipeline-warm:validated 6 |
gpu-deferred-mask-page-0-canvas-tile:start 6, gpu-deferred-mask-page-0-canvas-tile:validated 6, gpu-deferred-mask-page-0-first-tile:start 6, gpu-deferred-mask-page-0-first-tile:validated 6, gpu-radial-page-0-canvas-tile:start 6, gpu-radial-page-0-canvas-tile:validated 6, gpu-radial-page-0-first-tile:start 6, gpu-radial-page-0-first-tile:validated 6, gpu-radial-page-0-scene-warm:start 6, gpu-radial-page-0-scene-warm:validated 6, gpu-radial-pipeline-warm:start 6, gpu-radial-pipeline-warm:validated 6, gpu-tiling-page-0-canvas-tile:start 6, gpu-tiling-page-0-canvas-tile:validated 6, gpu-tiling-page-0-first-tile:start 6, gpu-tiling-page-0-first-tile:validated 6, gpu-tiling-page-0-scene-warm:start 6, gpu-tiling-page-0-scene-warm:validated 6, gpu-tiling-pipeline-warm:start 6, gpu-tiling-pipeline-warm:validated 6 |
| Reconcile modes | none | none |
| Fallback reasons | none | none |
| Thumbnail paths | none | none |
| Page-raster outcomes | none | none |
| Web-worker outcomes | none | none |
| Worker request kinds | none | none |
| Worker phase outcomes | none | none |
| Worker transcript paths | none | none |
| Tile slice classes | none | none |
| Tile rung/class batches | none | none |
| Scenario gpu-deferred-mask-page-0-canvas-tile worker outcomes | none | none |
| Scenario gpu-deferred-mask-page-0-first-tile worker outcomes | none | none |
| Scenario gpu-radial-page-0-canvas-tile worker outcomes | none | none |
| Scenario gpu-radial-page-0-first-tile worker outcomes | none | none |
| Scenario gpu-radial-page-0-scene-warm worker outcomes | none | none |
| Scenario gpu-radial-pipeline-warm worker outcomes | none | none |
| Scenario gpu-tiling-page-0-canvas-tile worker outcomes | none | none |
| Scenario gpu-tiling-page-0-first-tile worker outcomes | none | none |
| Scenario gpu-tiling-page-0-scene-warm worker outcomes | none | none |
| Scenario gpu-tiling-pipeline-warm worker outcomes | none | none |
Baseline build: commit=fe25e4a166b1938ca6ebeaf76c1405edd3f94e35. |
DartPDF app previewVisit the DartPDF app preview preview URL for this PR (updated for commit 02048a8): https://dartpdf-app--pr754-codex-deferred-mask-zw78isqd.web.app (expires Mon, 31 Aug 2026 12:23:48 GMT) |
Native Patrol performanceAutomated for commit Android comparison with
|
| Signal | Main | PR | Change |
|---|---|---|---|
Scenario native-mobile-tiles elapsed p50 |
2907.0 ms | 3095.0 ms | +6.5% |
| Jank total p95 | 923.4 ms | 996.8 ms | +7.9% |
| Reconcile p95 | 25.0 ms | 17.3 ms | -30.9% |
| Raster p95 | 355.6 ms | 358.8 ms | +0.9% |
| Jank frames | 402 | 403 | +1 |
| Reconcile fallbacks | 1 | 1 | — |
| Page-raster rejects | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
iOS Simulator comparison with main
Lower timing is better. Structural counts should stay stable unless the PR intentionally changes the exercised path.
Scenario elapsed uses p50 across repeated runs; phase and tail signals remain p95. Samples (main / PR): native-mobile-tiles n/a / 3.
When both cohorts have at least four samples, overlapping interquartile ranges are labelled within run spread instead of showing a misleading percentage.
main; timing deltas are not like-for-like.
| Signal | Main | PR | Change |
|---|---|---|---|
Scenario native-mobile-tiles elapsed p50 |
n/a | 2093.0 ms | n/a |
| Jank total p95 | n/a | 392.6 ms | n/a |
| Reconcile p95 | n/a | 7.1 ms | n/a |
| Raster p95 | n/a | 39.4 ms | n/a |
| Jank frames | 0 | 139 | +139 |
| Reconcile fallbacks | 0 | 1 | +1 |
| Page-raster rejects | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
View Android and iOS performance details
Patrol Android performance
Observational trace from the real Patrol device journey. Use it for PR comparisons; wall-clock values are not a CI gate.
| Signal | Result |
|---|---|
| Build | commit=c534c87b814c6736b7e91748b26a654149af3013 |
| Journey segments | 8 |
| Perf events | 1290 |
| Trace span | 81947.0 ms |
| Jank frames | 403 |
| Jank total p50 / p95 / max | 189.9 ms / 996.8 ms / 2474.1 ms |
| Reconcile p50 / p95 / max | 0.8 ms / 17.3 ms / 17.3 ms |
| Reconcile modes | fullReload 1, incremental 10 |
| Reconcile fallbacks | different-cos 1 |
| Thumbnail paths | none |
| Page-raster outcomes | hit 1, miss 111, policy 7, store 2 |
| Web-worker outcomes | none |
| Worker phase requests | 0 |
| Worker total p50 / p95 / max | n/a |
| Worker decode p50 / p95 / max | n/a |
| Worker image-cache peak | n/a |
| Worker image-cache lookups | 0 hit / 0 miss (n/a) |
| Worker image-cache request paths | 0 reuse / 0 miss-only / 0 no-lookup |
| Worker image-cache net growth | 0 entries / 0 B |
| Scenarios | native-mobile-tiles:start 3, native-mobile-tiles:validated 3 |
| Raster p50 / p95 / max | 77.0 ms / 358.8 ms / 1202.7 ms |
| Tile replay requests | 0 |
| Tile replay p50 / p95 / max | n/a |
| Tile replay raster p50 / p95 / max | n/a |
| Tile slice classes | prefetch 72 batches / 126 tiles, visible 12 batches / 66 tiles |
| Tile rung/class batches | rung-0/prefetch 72, rung-0/visible 12 |
| Tile retained peak | 64.0 MiB / 64 entries |
| Tile policy snapshots | 3 |
| Tile budget peak | 64.0 MiB |
| Tile scheduled / landed / discarded | 192 / 192 / 0 |
| Tile discard rate | 0.0% |
| Static-view reschedules | 0 |
Scenario breakdown
| Scenario | Runs | Elapsed p50 / p95 / max | Jank p95 | Reconcile p95 | Raster p95 | Worker total p95 | Decode p95 | Tile replay / prefetch batches | Tile retained peak | Cache lookups | Image cache peak | Worker outcomes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
native-mobile-tiles |
3 | 3095.0 ms / 3456.0 ms / 3456.0 ms | 589.2 ms | n/a | 259.7 ms | n/a | n/a | 0 / 72 | 64.0 MiB / 64 entries | 0 hit / 0 miss (n/a) | n/a | none |
Artifacts: patrol-perf.log (normalized raw trace), patrol-perf.json (machine comparison), patrol-perf-headline.md (visible PR headline), and this full Markdown summary.
Patrol Android comparison with main
Advisory only: timing changes do not fail CI. The baseline is the newest usable Android artifact from Patrol E2E on main.
Scenario elapsed p50 changes are labelled within run spread when both cohorts have at least four samples and their interquartile ranges overlap.
| Signal | Main | PR | Change |
|---|---|---|---|
| Journey segments | 8 | 8 | — |
| Perf events | 1279 | 1290 | +11 |
| Jank frames | 402 | 403 | +1 |
| Jank total p95 | 923.4 ms | 996.8 ms | +7.9% |
| Reconcile p95 | 25.0 ms | 17.3 ms | -30.9% |
| Reconcile fallbacks | 1 | 1 | — |
| Thumbnail preview hits | 0 | 0 | — |
| Page-raster rejects | 0 | 0 | — |
| Web-worker ready | n/a | n/a | n/a |
| Web-worker null starts | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
| Worker phase requests | 0 | 0 | — |
| Worker phase total p95 | n/a | n/a | n/a |
| Worker decode p95 | n/a | n/a | n/a |
| Raster p95 | 355.6 ms | 358.8 ms | +0.9% |
| Tile replay requests | 0 | 0 | — |
| Tile prefetch batches | 70 | 72 | +2 |
| Tile prefetch tiles | 126 | 126 | — |
| Tile replay p95 | n/a | n/a | n/a |
| Tile replay raster p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles runs | 3 | 3 | — |
| Scenario native-mobile-tiles elapsed p50 | 2907.0 ms | 3095.0 ms | +6.5% |
| Scenario native-mobile-tiles elapsed p95 | 2957.0 ms | 3456.0 ms | +16.9% |
| Scenario native-mobile-tiles jank p95 | 719.4 ms | 589.2 ms | -18.1% |
| Scenario native-mobile-tiles reconcile p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles raster p95 | 246.5 ms | 259.7 ms | +5.4% |
| Scenario native-mobile-tiles worker total p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles decode p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles tile replay requests | 0 | 0 | — |
| Scenario native-mobile-tiles tile prefetch batches | 70 | 72 | +2 |
| Structural signal | Main | PR |
|---|---|---|
| Scenarios | native-mobile-tiles:start 3, native-mobile-tiles:validated 3 |
native-mobile-tiles:start 3, native-mobile-tiles:validated 3 |
| Reconcile modes | fullReload 1, incremental 10 |
fullReload 1, incremental 10 |
| Fallback reasons | different-cos 1 |
different-cos 1 |
| Thumbnail paths | none | none |
| Page-raster outcomes | miss 113, policy 7, store 2 |
hit 1, miss 111, policy 7, store 2 |
| Web-worker outcomes | none | none |
| Worker request kinds | none | none |
| Worker phase outcomes | none | none |
| Worker transcript paths | none | none |
| Tile slice classes | prefetch 70, visible 12 |
prefetch 72, visible 12 |
| Tile rung/class batches | rung-0/prefetch 70, rung-0/visible 12 |
rung-0/prefetch 72, rung-0/visible 12 |
| Scenario native-mobile-tiles worker outcomes | none | none |
Baseline build: commit=fe25e4a166b1938ca6ebeaf76c1405edd3f94e35. |
Patrol iOS Simulator performance
Observational trace from the real Patrol device journey. Use it for PR comparisons; wall-clock values are not a CI gate.
| Signal | Result |
|---|---|
| Build | commit=c534c87b814c6736b7e91748b26a654149af3013 |
| Journey segments | 8 |
| Perf events | 1046 |
| Trace span | 79530.0 ms |
| Jank frames | 139 |
| Jank total p50 / p95 / max | 64.2 ms / 392.6 ms / 1066.8 ms |
| Reconcile p50 / p95 / max | 0.3 ms / 7.1 ms / 7.1 ms |
| Reconcile modes | fullReload 1, incremental 10 |
| Reconcile fallbacks | different-cos 1 |
| Thumbnail paths | none |
| Page-raster outcomes | hit 1, miss 106, policy 7, store 2 |
| Web-worker outcomes | none |
| Worker phase requests | 0 |
| Worker total p50 / p95 / max | n/a |
| Worker decode p50 / p95 / max | n/a |
| Worker image-cache peak | n/a |
| Worker image-cache lookups | 0 hit / 0 miss (n/a) |
| Worker image-cache request paths | 0 reuse / 0 miss-only / 0 no-lookup |
| Worker image-cache net growth | 0 entries / 0 B |
| Scenarios | native-mobile-tiles:start 3, native-mobile-tiles:validated 3 |
| Raster p50 / p95 / max | 2.8 ms / 39.4 ms / 256.0 ms |
| Tile replay requests | 0 |
| Tile replay p50 / p95 / max | n/a |
| Tile replay raster p50 / p95 / max | n/a |
| Tile slice classes | prefetch 66 batches / 126 tiles, visible 12 batches / 66 tiles |
| Tile rung/class batches | rung-0/prefetch 66, rung-0/visible 12 |
| Tile retained peak | 64.0 MiB / 64 entries |
| Tile policy snapshots | 3 |
| Tile budget peak | 64.0 MiB |
| Tile scheduled / landed / discarded | 192 / 192 / 0 |
| Tile discard rate | 0.0% |
| Static-view reschedules | 0 |
Scenario breakdown
| Scenario | Runs | Elapsed p50 / p95 / max | Jank p95 | Reconcile p95 | Raster p95 | Worker total p95 | Decode p95 | Tile replay / prefetch batches | Tile retained peak | Cache lookups | Image cache peak | Worker outcomes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
native-mobile-tiles |
3 | 2093.0 ms / 2221.0 ms / 2221.0 ms | 232.5 ms | n/a | 21.5 ms | n/a | n/a | 0 / 66 | 64.0 MiB / 64 entries | 0 hit / 0 miss (n/a) | n/a | none |
Artifacts: patrol-perf.log (normalized raw trace), patrol-perf.json (machine comparison), patrol-perf-headline.md (visible PR headline), and this full Markdown summary.
Patrol iOS Simulator comparison with main
Advisory only: timing changes do not fail CI. The baseline is the newest usable iOS Simulator artifact from Patrol E2E on main.
Scenario elapsed p50 changes are labelled within run spread when both cohorts have at least four samples and their interquartile ranges overlap.
Coverage differs between the artifacts; timing deltas are not like-for-like until main contains the same scenarios.
| Signal | Main | PR | Change |
|---|---|---|---|
| Journey segments | 0 | 8 | +8 |
| Perf events | 0 | 1046 | +1046 |
| Jank frames | 0 | 139 | +139 |
| Jank total p95 | n/a | 392.6 ms | n/a |
| Reconcile p95 | n/a | 7.1 ms | n/a |
| Reconcile fallbacks | 0 | 1 | +1 |
| Thumbnail preview hits | 0 | 0 | — |
| Page-raster rejects | 0 | 0 | — |
| Web-worker ready | n/a | n/a | n/a |
| Web-worker null starts | 0 | 0 | — |
| Web-worker fatal fallbacks | 0 | 0 | — |
| Worker phase requests | 0 | 0 | — |
| Worker phase total p95 | n/a | n/a | n/a |
| Worker decode p95 | n/a | n/a | n/a |
| Raster p95 | n/a | 39.4 ms | n/a |
| Tile replay requests | 0 | 0 | — |
| Tile prefetch batches | n/a | 66 | n/a |
| Tile prefetch tiles | n/a | 126 | n/a |
| Tile replay p95 | n/a | n/a | n/a |
| Tile replay raster p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles runs | n/a | 3 | n/a |
| Scenario native-mobile-tiles elapsed p50 | n/a | 2093.0 ms | n/a |
| Scenario native-mobile-tiles elapsed p95 | n/a | 2221.0 ms | n/a |
| Scenario native-mobile-tiles jank p95 | n/a | 232.5 ms | n/a |
| Scenario native-mobile-tiles reconcile p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles raster p95 | n/a | 21.5 ms | n/a |
| Scenario native-mobile-tiles worker total p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles decode p95 | n/a | n/a | n/a |
| Scenario native-mobile-tiles tile replay requests | n/a | 0 | n/a |
| Scenario native-mobile-tiles tile prefetch batches | n/a | 66 | n/a |
| Structural signal | Main | PR |
|---|---|---|
| Scenarios | none | native-mobile-tiles:start 3, native-mobile-tiles:validated 3 |
| Reconcile modes | none | fullReload 1, incremental 10 |
| Fallback reasons | none | different-cos 1 |
| Thumbnail paths | none | none |
| Page-raster outcomes | none | hit 1, miss 106, policy 7, store 2 |
| Web-worker outcomes | none | none |
| Worker request kinds | none | none |
| Worker phase outcomes | none | none |
| Worker transcript paths | none | none |
| Tile slice classes | none | prefetch 66, visible 12 |
| Tile rung/class batches | none | rung-0/prefetch 66, rung-0/visible 12 |
| Scenario native-mobile-tiles worker outcomes | none | none |
Baseline build: unstamped. |
Summary
/SMasksurfaces on the Flutter GPU pathValidation
fvm dart analyzefvm flutter testinpackages/dart_pdf_editor_flutter_gpufirstRoute=flutter_gpu, 2 texture uploads, 0 raster fallbacks, 0.492/255 mean Canvas differenceThe local benchmark is a route/correctness smoke, not the performance conclusion. CI runs the exact base and candidate six times on one macOS Metal host with balanced ordering and will publish the comparison.