Skip to content

perf(gpu): retain deferred image masks - #754

Open
ben-milanko wants to merge 2 commits into
mainfrom
codex/deferred-mask-gpu
Open

perf(gpu): retain deferred image masks#754
ben-milanko wants to merge 2 commits into
mainfrom
codex/deferred-mask-gpu

Conversation

@ben-milanko

Copy link
Copy Markdown
Owner

Summary

  • keep platform-decoded JPEGs with companion /SMask surfaces on the Flutter GPU path
  • cache the base and mask as separate retained textures and combine them through the existing soft-mask shader
  • reuse the soft-mask uniform builder across retained groups and deferred image masks
  • add the deterministic deferred-mask fixture to the balanced six-run same-host Metal comparison

Validation

  • fvm dart analyze
  • fvm flutter test in packages/dart_pdf_editor_flutter_gpu
  • focused Metal backend suite: 18 passed, 1 expected non-GPU-context skip
  • Metal corpus parity: 218 passed; acceptance totals remain PDF.js 101/78 and Ghent 19/38
  • exact local benchmark route: firstRoute=flutter_gpu, 2 texture uploads, 0 raster fallbacks, 0.492/255 mean Canvas difference
  • performance summarizer tests
  • workflow YAML parse check

The 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.

@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.01%. Comparing base (fe25e4a) to head (c534c87).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main     #754   +/-   ##
=======================================
  Coverage   90.01%   90.01%           
=======================================
  Files         320      320           
  Lines       68975    68975           
=======================================
  Hits        62088    62088           
  Misses       6887     6887           
Flag Coverage Δ
app 83.10% <ø> (ø)
dart_pdf_cli 90.91% <ø> (ø)
dart_pdf_editor 90.69% <ø> (ø)
pdf_cos 92.54% <ø> (ø)
pdf_document 89.51% <ø> (ø)
pdf_graphics 91.89% <ø> (ø)
pdf_ocr_vlm 87.73% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

Copy link
Copy Markdown
Contributor

Flutter GPU performance

Automated on macOS Metal for commit c534c87 · workflow run and downloadable traces
Same-host A/B: base fe25e4a and PR were alternated on one GitHub runner.

macOS Metal GPU comparison with main

First tile vs Canvas (p50, main → PR): deferred mask page 0 0.10× → 0.16×; radial page 0 30.6× → 45.1×; tiling page 0 50.4× → 54.3×.

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): gpu-deferred-mask-page-0-canvas-tile 6 / 6, gpu-deferred-mask-page-0-first-tile 6 / 6, gpu-radial-page-0-canvas-tile 6 / 6, gpu-radial-page-0-first-tile 6 / 6, gpu-radial-page-0-scene-warm 6 / 6, gpu-radial-pipeline-warm 6 / 6, gpu-tiling-page-0-canvas-tile 6 / 6, gpu-tiling-page-0-first-tile 6 / 6, gpu-tiling-page-0-scene-warm 6 / 6, gpu-tiling-pipeline-warm 6 / 6.

When both cohorts have at least four samples, overlapping interquartile ranges are labelled within run spread instead of showing a misleading percentage.

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.

@github-actions

Copy link
Copy Markdown
Contributor

DartPDF app preview

Visit 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)

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Native Patrol performance

Automated for commit c534c87 · workflow run and downloadable native traces

Android 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 3 / 3.

When both cohorts have at least four samples, overlapping interquartile ranges are labelled within run spread instead of showing a misleading percentage.

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.

⚠️ At least one scenario has fewer than three samples; treat its timing delta as provisional.

⚠️ Scenario coverage differs from 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants