Two wins that directly shrink /map and /weather latency under interactive use: **Debounce the moveend → repaint path (150ms).** Leaflet fires `moveend` once per pan but 5–10× per second during a wheel-zoom. Previously each one ran a full `scores_at` (or `weather_grid_at`) read + a ~20–100KB websocket push. Now they coalesce into a single trailing-edge flush via `schedule_bounds_update` (and the /weather twin `schedule_weather_flush`) — the same pattern we already use for forecast preload. 150ms is short enough that the user doesn't perceive the pause; >90% of the burst disappears. **Parallelize point_forecast across 4 tasks.** The sparkline that pops up on point click was reading up to 18 `.prop` files sequentially off NFS. Each read is cheap (pread one byte at row*cols+col) but RTT-dominated. `Task.async_stream` with max_concurrency=4, ordered=true brings 18-file wall time from ~50ms down to ~15ms on NFS without changing the public API. No test changes: existing map_bounds test only asserts the bounds assign lands, which the debounced path still does synchronously. |
||
|---|---|---|
| .. | ||
| microwaveprop | ||
| microwaveprop_web | ||
| mix/tasks | ||
| microwaveprop.ex | ||
| microwaveprop_web.ex | ||