Recorded 2026-09-20. Source comparison f95e22ae670 -> ab3d9b3fbf9.
UIKit: Apple M4 Max, macOS 27.0, Mac Catalyst UIKit, Swift -O.
Run bash reproduce-perf.sh /path/to/t3code with both commits available.
One warm-up + seven fresh-view trials per revision and size. Each trial paints
31 times and toggles a comment 31 collapse/expand pairs. Report medians of trial
statistics (including median of trial p95 paint times), not pooled percentiles.
1k/10k lines, 80% ASCII / 10% CJK / 10% emoji+combining accents. 390x844 points,
2x bitmap, word wrapping and word diff ranges enabled. Every viewport repaint
calls the actual production ReviewDiffContentView.draw into a fresh UIKit image;
not a cached layer snapshot, not GPU/presentation frame timing. It includes image
allocation. Cold preparation ends at rows-decoded receipt. Token patch contains
50 row tokens and ends at tokens-patch-decoded receipt, followed by a repaint.
The Expo stub only provides UIView and event dispatch, not layout/drawing.
Main-run-loop metric is the longest observed RunLoop.run iteration; it is NOT a
frame duration. Fresh views are cold with respect to their own geometry; fonts
and OS caches are warm. Width/font invalidation was not measured.
Same inputs, but corrected Unicode wrapping changes visible geometry, so paint
numbers are viewport costs rather than equal-glyph throughput comparisons.

Android: installed current full debug app on Pixel 9 API36 Android16 x86_64
emulator, Ryzen7 8845HS host, 60Hz, T3 Device stream active, no recording.
App connected to isolated backend over Tailscale; normal Metro development mode.
Fixture: contiguous word changes in ASCII, CJK, emoji, accents, Arabic and tabs,
with unchanged prefixes/suffixes; scrolling traverses these highlighted rows.
Each trial: perf frames reset, ten alternating 1300px swipes, 700ms pause between
swipes, perf frames read. Three samples. Startup/navigation excluded; samples
include idle intervals between reset/read. Counts are Android gfxinfo rendered
frames/janky-frame deadline counts, not video FPS. No original-PR Android frame
baseline or physical device/release measurements. Whole-app effects and emulator
noise are included. Memory file is whole-process PSS/RSS, not diff allocations.
