# Kobo Deluxe DOD Refactor — Benchmark Scoreboard Each row is one phase of the refactor (see `~/.claude/plans/can-you-explain-the-noble-wilkes.md`). Numbers are median ns/frame from `KOBO_PROF=1 KOBO_STRESS=1500 ./build/kobodl`, ~1000 frames, release build (`-O2 -g`). ## How to capture a baseline ```sh cd build cmake --build . -j KOBO_PROF=1 KOBO_STRESS=1500 ./kobodl # play through a stage; profile dumps every 600 frames to stderr. # Redirect stderr to a file if you want to keep it: KOBO_PROF=1 KOBO_STRESS=1500 ./kobodl 2>prof.log ``` The profiler dumps a table per zone with `calls`, `total_ms`, `ns/call`. Record the `ns/call` for these zones (they are the moving parts the refactor targets): | Zone | What it measures | |-----------------------|-----------------------------------------------------| | `run_game` | Full game tick | | `myship.move` | Player + bolt update | | `enemies.move` | Realize pass + move pass combined | | `enemies.realize` | Just the realize-reserved pass | | `enemies.move_pass` | Just the per-enemy move pass (the hot loop) | | `hit_structure` | Player vs map + bolt vs map | | `hit_bolt` | Bolt-vs-enemy scan (called from inside enemy move) | ## Scoreboard | Phase | run_game | myship.move | enemies.move_pass | hit_bolt | Notes | |------------------------------|---------:|------------:|------------------:|---------:|-------| | 0 — baseline | ? | ? | ? | ? | TBD — user to capture | | 1 — hot/cold split | | | | | | | 2 — SoA pool | | | | | | | 3 — bucket dispatch | | | | | | | 4 — flipped bolt collision | | | | | | | 5 — render decouple | | | | | | | 6 — SIMD integrator (opt.) | | | | | | ## Notes - `KOBO_STRESS=N` keeps the pool topped up with rocks; N=1500 sits well below ENEMY_MAX=2048 so the spawner doesn't thrash on full-pool checks. - The stress spawner uses `pubrand`, which is acceptable for benchmarking but will *not* produce identical demos across builds — that's fine, we only care about steady-state cost. - For a stable run, start the game, get into a stage, then let it sit for ~1000 frames before reading numbers. The first dump (frame 600) will include startup costs and should be discarded.