mimir-room bench — 2026-10-13
Box: dwarf (AMD Ryzen 5 7535HS, 12 threads, 61 GiB), load average 11–25 while running (shared box). SuiteSparse:GraphBLAS 7.4.0 (Ubuntu), release build. Runner: mimir-room <lake> bench [--universe] (src/bin/mimir-room.rs) and mimir-room <lake> diff --repo R --from N --to M. Lakes are COPIES under ~/d-scip/tmp/room-bench/ (EventLog::open creates missing tables).
Lakes:
- zz — znippy-zoomies, lane 9b run (
--with-binary --std): 1 seq, 594 crates, 8 bins, std/core/alloc in the ring (~/d-scip/tmp/lgzm/state/lake). - heimdal — heimdal's last 10 first-parent commits, re-consumed with the binwire producers (
--with-binary; heimdal links no bin, so its binary stream is empty — the evidence says so). The oldere2e-heimdal-v3lake predatesuniverse_manifest.rustc_releaseand does not open.
Build (fold → node table → matrices → provenance)
(Round 1. The ring-on rows are superseded by round 2 below: the ring is now scoped to what the seq depends on / links.)
| lake | ring | nodes | edges | open cold | fold | index | provenance | matrices | open cached | RSS after build (peak) |
| zz | off | 109 883 | 155 457 | 2 071 ms | 677 | 141 | 1 241 ¹ | 7 | 3.2 ms | 466 MiB (684) |
| zz | on | 1 063 783 | 2 468 280 | 6 561 ms | 4 765 | 1 589 | 2 | 91 | 16.2 ms | 597 MiB (1 485) |
| heimdal @10 | off | 1 751 | 4 623 | 30 ms | 22 | 1 | 0 | 0 | 3.6 ms | 27 MiB (34) |
| heimdal @10 | on | 313 336 | 694 873 | 1 266 ms | 928 | 309 | 0 | 16 | 3.4 ms | 367 MiB (384) |
¹ ring off but the binary stream links ring items: the provenance lookup folds the ring's 1.1 M node events once to find which linked ids the ring defines (same rule as EventLog::provenance). zz's derived provenance equals the ingest's own print exactly: {SourceOnly: 15982, BinaryOnly: 79593, Both: 13656}.
Every kind took the sorted fast path (ImportPath::SortedPack): edges are packed (from << 32 | to), sorted, deduplicated before the import. "open cached" = scope resolution + log identity + stamp read + cache hit.
Edges per kind (zz, ring on)
| CONTAINS | CALLS | USES_TYPE | READS_FIELD | IMPLEMENTS | FOR_TYPE | EXPANDS | INSTANCE_OF | TESTS | DEPENDS_ON |
| 983 547 | 508 665 | 423 324 | 155 397 | 110 481 | 106 602 | 97 013 | 77 308 | 3 251 | 2 692 |
Node kinds (zz, ring on): param 342 024 · method 180 844 · generic 124 028 · impl 121 017 · mono_instance 77 308 · field 48 228 · const 43 393 · fn 26 077 · assoc_type 26 915 · variant 15 998 · struct 15 480 · ffi 4 346 · ffi_import 35 · …
Queries (Jikes kinds CALLS | USES_TYPE | IMPLEMENTS | FOR_TYPE)
| lake | ring | dependents ×1 first (builds union + Aᵀ) | dependents ×1 warm | dependents ×1000 | reach ×1000 forward | min_hops_to ffi |
| zz | off | 28 ms → 2 006 | 0.7 ms | 1.8 ms → 2 192 | 3.8 ms → 2 300 | 25.8 ms → 324 nodes, ≤ 11 hops |
| zz | on | 585 ms → 50 276 | 114.5 ms | 127.9 ms → 33 336 | 13.2 ms → 20 778 | 140.4 ms → 68 645 nodes, ≤ 17 hops |
| heimdal | off | 0 ms → 66 | 0.1 ms | 0.1 ms (305 seeds) → 0 | 0.1 ms → 345 | 0 → MISSING (no ffi node, no binary stream) |
| heimdal | on | 11 ms → 5 859 | 1.4 ms | 2.8 ms → 5 784 | 3.5 ms → 8 197 | 3.7 ms → 2 507 nodes, ≤ 16 hops |
Single seed = the most-called node (zz ring on: core … Try#branch(), fan-in 12 890). ×1000 = defined fns/methods at a fixed stride.
Time travel: diff seq N−1 → N (heimdal)
| pair | ring | diff | nodes | edges changed | note |
| 1 → 2 | off | 1.2 ms | +91 −45 | 439 | fri split into frida + tyr |
| 4 → 5 | off | 1.0 ms | +300 −6 | 950 | frida on published eid-core |
| 4 → 5 | on | 182.5 ms | +272 −6 | 950 | 313 k-node union space; 28 of ring-off's +300 were stubs the ring already defines |
| 7 → 8 | off | 1.5 ms | +37 −0 | 140 | |
| 8 → 9 | off | 1.4 ms | +0 −0 | 0 | 22-line edit: spans only (semantic identity) |
| 9 → 10 | on | 120 ms (+1 100 ms to build seq 9) | 0 | 0 | docs-only commit |
Seq 3 of this re-consume is an error row (the workspace did not load at that commit in the consumer's clone: a path dependency outside the repo), so seq 3 = seq 2's state, by the log's own rules.
Reading
- Cold open is the fold (skade scan + per-identity last event); matrices are ~1–2 % of it. Cached reopen: 3–16 ms.
- Keep Aᵀ cached (lane 7): the first dependents walk pays for the kind union and its transpose once (585 ms at 2.5 M edges), later walks 0.7–128 ms.
- Ring off + binary stream: the ring lookup for provenance dominates the cold open (1.2 s of 2.1 s on zz). Caching the ring's definitions per universe manifest would remove it (open item).
Round 2 (same day): scoped ring, ring definitions cache, Jikes down CONTAINS
Load average 9–10. Ring on now holds only the ring crates the scope's local crates DEPENDS_ON at their seqs, plus every ring crate its binaries link (panic_unwind / panic_abort are linked with no DEPENDS_ON naming them). zz has 594 dumped crates; dependency/build-only crates leave the room. Ring on and ring off now give the same provenance for every linked item (zz: BinaryOnly 79 593 · Both 13 656 either way; before the linked-owner rule 6 panic-runtime items differed).
| lake | ring | nodes | edges | open cold (no caches) | open cold, ring defs cached | open cached |
| zz | off | 109 883 | 155 457 | 1 990 ms (provenance 1 324) | 682 ms | 2.6 ms |
| zz | on | 992 085 | 2 277 785 | 5 386 ms | 5 308 ms (ring folded anyway) | 7.2 ms |
| heimdal @10 | off | 1 751 | 4 623 | 34 ms | 26 ms | 3.8 ms |
| heimdal @10 | on | 280 530 | 598 346 | 1 247 ms | 1 207 ms | 3.6 ms |
The ring definitions cache is per process (per log identity + manifest snapshot): the first ring-off open with linked ring items still folds the ring once (1.3 s on zz); later cold builds skip it (2.0 s → 0.7 s).
| lake | ring | dependents ×1 first / warm | dependents ×1000 | reach ×1000 fwd | min_hops_to ffi |
| zz | off | 5 / 0.8 ms → 2 006 | 1.5 ms → 2 192 | 1.1 ms | 1.4 ms → 324 |
| zz | on | 530 / 53 ms → 44 242 | 49.8 ms → 34 476 | 10.7 ms | 179 ms → 62 120 |
| heimdal | on | 48 / 2.6 ms → 4 767 | 3.7 ms → 2 932 | 3.6 ms | 4.1 ms → 2 507 |
Dependents now walk Jᵀ ∨ diag(impls)·CONTAINS (down from reached impl blocks to their items); "first" includes building the union, its transpose and that matrix.
Diff with changed (payload hash of nodes in both), heimdal:
| pair | ring | diff | nodes | changed |
| 1 → 2 | off | 1.1 ms | +91 −45 | 0 |
| 4 → 5 | off | 1.4 ms | +300 −6 | 0 |
| 4 → 5 | on | 57.7 ms | +11 623 −6 | 0 — seq 5 drops a path dep for published eid-core 0.1: eid-core and its deps ENTER the ring at 5 (round 1 showed +272, the unscoped ring hid it) |
| 7 → 8 | off | 0.9 ms | +37 −0 | 0 |
| 8 → 9 | off | 0.8 ms | 0 | 0 (spans only) |
changed 0 checked against the log: no + node event at seq b for a defined id open at seq a in these pairs (heimdal's edits there add/remove items or change bodies/consts, which are not node payload).