Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

crates/mimir-room/BENCH-2026-10-13.md

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:

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

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).