diff --git a/docs/bench/compose-phone-v3-2026-09-09.md b/docs/bench/compose-phone-v3-2026-09-09.md new file mode 100644 index 0000000..a9e0793 --- /dev/null +++ b/docs/bench/compose-phone-v3-2026-09-09.md @@ -0,0 +1,96 @@ +# 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) +``` diff --git a/docs/bench/iris-phone-v3-2026-09-09.md b/docs/bench/iris-phone-v3-2026-09-09.md new file mode 100644 index 0000000..3aef95a --- /dev/null +++ b/docs/bench/iris-phone-v3-2026-09-09.md @@ -0,0 +1,76 @@ +# iris phone bench v3, 2026-09-09 + +Fresh release run on Iris's Pixel 9 Pro XL after the frame-report corrections, +realistic streamed blocks, retained arena uploads and fling-clock fix. Iris +reported that everything was visually working as intended. This run is paired +with `compose-phone-v3-2026-09-09.md`. + +The iris reporter resolved the phone at **120 Hz** (8.3 ms budget). The paired +Compose report says 60 Hz, but Iris observed what looked like 120 Hz and its +fling count works out to about 118 fps after the benchmark's deliberate rests +are removed. Compose nevertheless calculated `late` using its reported 60 Hz +and 16.7 ms budget, so the two apps' `late` percentages are not directly +comparable. Against the real 8.3 ms budget, iris recorded 0.5% late frames +overall. Streaming had no late frames or missed vsyncs, with p50 3.1 ms and +p99 5.0 ms, against Compose's p50 13.8 ms and p99 42.6 ms. The five missed +vsyncs in the fling phase are 0.15% of its 3,409 frames; Iris could not see lag +in the finished UI. + +Across the similarly long complete runs, iris used 37.5 seconds of process CPU +against Compose's 70.5 seconds (47% less) and peaked at 382,796 kB RSS against +581,084 kB (34% less). Mean battery current was 226 mA against Compose's 591 +mA; that is encouraging but remains a device-state-sensitive reading rather +than a controlled energy measurement. + +The keyboard line does **not** describe a failed opening. The type phase opens +the IME and leaves it visible. The keyboard phase's first `show_ime` is +therefore a no-op rather than a new hidden-to-visible transition; it then +observes five hides and four reopens. Including the opening in the type phase, +the complete run observed five openings and five closings. + +`acquire` is the wait for a swapchain image, not iris's own work. In particular, +the fling's 8.0 ms total median consists mostly of a healthy 6.0 ms acquire +wait; its median build work is 0.4 ms. `late` is judged on work with that +acquire wait removed. + +```text +iris bench report +input/frame trace: off +per phase: + fling: 3409 frames over 33.2s + late: 11 (0.3%) missed vsyncs: 5 + total p50 8.0ms p90 9.0ms p99 10.5ms + build p50 0.4ms acquire p50 6.0ms submit p50 1.6ms + worst 17.4ms + stream: 401 frames over 21.3s + late: 0 (0.0%) missed vsyncs: 0 + total p50 3.1ms p90 4.0ms p99 5.0ms + build p50 1.1ms acquire p50 0.3ms submit p50 1.6ms + worst 7.0ms + type: 1240 frames over 64.5s + late: 14 (1.1%) missed vsyncs: 0 + total p50 5.6ms p90 6.8ms p99 9.1ms + build p50 2.5ms acquire p50 0.4ms submit p50 2.6ms + worst 12.8ms + keyboard: 341 frames over 9.8s + late: 0 (0.0%) missed vsyncs: 0 + total p50 2.1ms p90 2.8ms p99 4.5ms + build p50 0.3ms acquire p50 0.2ms submit p50 1.5ms + worst 8.5ms + +frames: + 5391 frames over 128.8s at 120Hz (as the display reports it; drew 120fps) (8.3ms budget) + late: 25 (0.5%) + total p50 7.5ms p90 8.8ms p99 10.2ms + worst 17.4ms + build_p50 0.4ms acquire_p50 5.3ms submit_p50 1.7ms + +bench: + fling: 8 flings out + 8 back at 12000px/s, travel start=idx=653/off=1557px outward=idx=528/off=909px end=idx=650/off=-103px ticked=frame-loop + scroll: 6 cycles (24 swipes, legacy tween), streamed 400/400 fixture events + type: 600 characters inserted then deleted, one per 50ms + keyboard: shown 4/5, hidden 5/5 (confirmed via on_insets_changed) + process CPU time over this run: 37457ms + peak RSS: 382796kB + battery current: mean -226354µA over 128 samples (min -404687, max -107812) +```