docs(quartz): record strfry head-to-head for the live negentropy index

Same container, 50k corpus, geode --no-search, strfry built from
source: identical-set reconcile 41.4 ms (geode) vs 30.1 ms (strfry) —
down to ~1.4x from the campaign-opening full-scan-per-open; cold
reconcile 177 vs 112 ms (geode's first open pays the lazy rebuild);
ingest at parity in this container; storage 72.8 vs 106 MiB. Notes the
zero-copy IStorage follow-up that would close the remaining ~11 ms.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TtDNpayEYvJH7QuPswND3A
This commit is contained in:
Claude
2026-07-03 23:15:09 +00:00
parent de388907c2
commit 0d6a9b1e4d
@@ -24,6 +24,24 @@ relayBench run controls container noise better than alternating runs,
but per-phase run-order bias is real (~100 ms on initial reconcile,
~10% on ingest) — always repeat with the order reversed.
**strfry head-to-head** (same container, 50k corpus, `--geode-no-search`,
strfry built from source, single run): identical-set reconcile geode
41.4 ms vs strfry 30.1 ms — the always-current-tree gap is down to
~1.4× from the campaign-opening "full scan + seal per open". Initial
(cold) reconcile 177 vs 112 ms: strfry keeps its tree across the whole
run while geode's first open pays the lazy rebuild. Ingest measured at
parity in this container (7,972 vs 7,860 ev/s — treat as ±noise, the
earlier 1.59× gap was measured on different hardware); storage 72.8 vs
106.0 MiB.
**Possible follow-up** if the residual matters: the per-open cost is now
the O(n) copy + re-seal into a `StorageVector` (~16 ms at 50k). A custom
immutable `IStorage` view over the live entries (copy-on-write chunks,
no re-seal) would make an open O(1), matching strfry's zero-copy read of
its tree — that is the "interesting part" the original backlog item
anticipated, deferred until a benchmark says the remaining ~11 ms is
worth it.
## Problem
A cold NEG-OPEN pays a full scan + O(n log n) seal: `snapshotIdsForNegentropy`