Arrowing down the device list on the PicoCalc stalled on every keystroke. The
time was not in the list: at 53 columns the full-size mark does not fit, so each
paint sent load_logo back to the disk for every size until one did, parsed and
measured each, and decoded every row again to centre it. None of that changes
between paints, and the splash paints on every keystroke and every idle tick.
compose_startup now asks _fitted_banner, a one-slot memo keyed by the banner and
the width, dropped on a platform switch with the other composition memos since
the fold bakes the theme in.
Measured on the desktop under the picocalc platform, splash at 53x26, ↓/↑
alternating: 31.1 ms a paint before, 2.3 ms after. The logo was nine-tenths of
the frame; the list itself is under 0.1 ms. 108 frames across 53x26, 53x40,
72x24, 100x30, 40x20 and 53x12, with and without a footnote, picocalc then
regular then picocalc again, come out byte-identical before and after. Not yet
timed on the device, which was unreachable; A/B it with profile-picocalc.
The splash's live rescan (f9e9271) was the first suspect and is not the cost:
a serial poll's device ids are stable, so it repaints only when a device comes
or goes, and the enumeration itself runs in a thread.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>