# Compose phone bench v3, 2026-09-09 Fresh release run on Iris's Pixel 9 Pro XL, kept as the Compose comparison for `iris-phone-v3-2026-09-09.md`. The report says **60 Hz** and therefore judges `late` against a 16.7 ms budget, but Iris observed what looked like 120 Hz. The fling count supports that observation: after subtracting the sixteen deliberate 300 ms rests, 3,279 frames over 27.9 seconds is about 118 fps. Android's adaptive-refresh query has previously returned 60 Hz during a run that actually sustained 120 Hz; unlike the corrected iris reporter, this Compose reporter does not resolve the platform answer against the measured cadence. Treat the physical display rate as likely 120 Hz but the printed `late` figures as calculated at 60 Hz, and compare millisecond percentiles rather than the two apps' `late` percentages. This reproduces the 2026-09-06 Compose v2 result closely. Streaming remains the long tail: 43.3% late, p50 13.8 ms and p99 42.6 ms. The counters below attribute it primarily to reparsing markdown while streaming (8.6 ms mean) and recording the changed block (6.3 ms mean). Fling, typing and keyboard remain clean at the reporter's 60 Hz budget. ```text ai-app render report device: Pixel 9 Pro XL (Google), Android 17 build: release transcript: 108 events, 26 rows, 58 units loaded viewport 1531px, 2 units visible on screen: the list's own 0px, AssistantMsg 24520px 0 tool calls and 0 groups open per phase: fling: 3279 frames over 32.7s late: 4 (0.1%) total p50 5.5ms p90 7.1ms p99 11.4ms worst 30.9ms stream: 1041 frames over 21.6s late: 451 (43.3%) total p50 13.8ms p90 32.1ms p99 42.6ms worst 58.5ms type: 2444 frames over 61.5s late: 29 (1.2%) total p50 7.2ms p90 13.4ms p99 16.8ms worst 32.9ms keyboard: 359 frames over 10.1s late: 1 (0.3%) total p50 6.2ms p90 7.7ms p99 10.5ms worst 16.7ms frames: 7122 frames over 125.8s at 60Hz (16.7ms budget) late: 485 (6.8%) total p50 6.0ms p90 13.9ms p99 34.0ms waited p50 0.5ms p90 1.2ms p99 20.9ms input p50 0.0ms p90 0.0ms p99 0.0ms anim p50 0.7ms p90 4.6ms p99 7.8ms layout p50 0.1ms p90 0.1ms p99 0.2ms draw p50 0.7ms p90 2.9ms p99 22.6ms sync p50 0.1ms p90 0.2ms p99 0.6ms issue p50 1.4ms p90 2.4ms p99 3.2ms swap p50 0.4ms p90 0.8ms p99 1.2ms gpu p50 1.5ms p90 2.1ms p99 6.6ms where the draw phase went: draw phase 1.74ms per frame, of which: the transcript: 0.24ms (measure 0.10, place 0.14, record 0.00) everything else: 1.49ms (85%) work since this was last copied: draw: the whole transcript: 280, 1.9ms total, 0.0ms mean, 0.0ms worst grouped tool runs: 407, 18.4ms total, 0.0ms mean, 0.2ms worst markdown cut into pieces: 40, 0.4ms total, 0.0ms mean, 0.0ms worst markdown parsed while composing: 2, 1.6ms total, 0.8ms mean, 1.1ms worst markdown ready: 323 markdown reparsed while streaming: 395, 3417.3ms total, 8.6ms mean, 29.3ms worst markdown warmed: 40, 39.3ms total, 1.0ms mean, 4.2ms worst measure: the whole transcript: 1977, 683.5ms total, 0.3ms mean, 13.7ms worst message composed: 397 message cut into parts: 40, 3.0ms total, 0.1ms mean, 0.2ms worst place: the whole transcript: 4306, 1003.1ms total, 0.2ms mean, 4.2ms worst record: one block: 394, 2473.7ms total, 6.3ms mean, 25.1ms worst session screen recomposed: 1631 status row recomposed: 1 transcript page from server: 10 unit composed: 927 units flattened: 408, 85.9ms total, 0.2ms mean, 2.0ms worst bench: fling: 8 flings out + 8 back at 12000px/s, travel start=idx=0/off=0px outward=idx=188/off=182px end=idx=0/off=0px scroll: 6 cycles (24 swipes, legacy tween), streamed 400/400 fixture events type: 600 characters inserted then deleted, one per 50ms keyboard: shown 5/5, hidden 5/5 (confirmed via isImeVisible) process CPU time over this run: 70502ms peak RSS: 581084kB battery current: mean -591350µA over 126 samples (min -2271093, max -99218) ```