KynetraDB benchmark ledger
Benchmarks
Each result below states what was measured, how, and what it does not show. Numbers come from the dated benchmark ledger committed alongside the engine — not from a marketing deck. Where a ship-gate was not met, it is on this page next to the win, not in a footnote.
Tidewater · 2026-07-27
SPANN postings served from mmap at query time
The disk tier stops being paid for in RAM. Settled postings are served zero-copy from mmap at query time, so the page cache is the tier and the process heap holds only the centroid navigator, centroid vectors, per-posting headers and the live memtable.
| Measure | Before (RAM HashMap) | After (mmap at query time) | Change |
|---|---|---|---|
| Resident memory, as % of raw f32 | ~16.4% | 0.13% | ~125x less |
| Resident bytes, 50,000 x 64 vectors | — | 16,400 bytes | — |
| Search results | baseline | byte-identical | no recall change |
Method
The rmp_serde posting blob was replaced with a raw fixed-stride layout
(SPP1 header plus packed_bits / corrections / residual_norms / id_offsets / id_blob).
A serialized blob must be fully deserialized to read one row, so offset-addressable rows
are the precondition for zero-copy. Readers Arc-clone posting handles under a short read
lock then scan lock-free; postings are immutable per epoch and flush maps only after
fsync, with the manifest as the commit point.
Meridian · 2026-07-27
Per-kind index: tenant-scoped reads go flat
A tenant-scoped list is filter(Filter::Kind("t_<pid>___...")), but a
bare Filter::Kind was not index-answerable, so a scoped read cost
O(all tenants' data). A per-kind id posting index now answers it directly.
| Arm | p50 at 10k background | p50 at 1M background | Shape | vs index-off at 1M |
|---|---|---|---|---|
| Ram, index on | 4.5 ms | 3.0 ms | flat (growth ≤ 1.00x) | ~28x faster |
| Ram, index off | 5.0 ms | 82.5 ms | linear (14.5–17.5x) | baseline |
| Disk, index on | 6.8 ms | 13.6 ms | monotone 1.90–2.37x | ~33x faster |
| Disk, index off | 9.1 ms | 443 ms | linear (40–49x) | baseline |
Method
Release build. A fixed 10,000-entity tenant-A corpus, with the background corpus scaled 10k → 1M. The axis is background corpus size; the baseline is the same engine with the index flag off. Both arms measured in the same run.
Ship-gates, reported as measured
Caustic · 2026-07-26
Sub-bit residual quantization
The sub-bit tier of the Prism density ladder: k-means residual coding, where the Beacon centroid doubles as the compression predictor, plus orthonormal projection to dim/shrink and a RaBitQ-style 1-bit sign code with unbiased estimation.
| Codec | recall@10 | Amortized B/vector | vs f32 | Recall per byte |
|---|---|---|---|---|
| Caustic, shrink=2 | 0.9950 | 57.5 | 53.4x | 1.76x better than RaBitQ |
| Prism-R (RaBitQ) | — | — | — | baseline |
Method
Measured at 768 dimensions on a 10,000-vector clustered corpus, 100 queries. The axis is amortized bytes per vector; the baseline is Prism-R (RaBitQ) measured in the same harness. "1.76x better recall-per-byte" is a figure-of-merit ratio against that RaBitQ baseline, not a speed claim.
Lodestar · 2026-07-27
SPANN large-filter native scan
SPANN filtered search dispatches on filter size: small filters take an exact branch, large ones a predicate-during-scan branch. Because the engine resolves small filters with its own scan, the large branch is the only one production reaches — and it was the one without coverage.
| Strategy | recall@10 | Budget | Holds across |
|---|---|---|---|
| Native predicate-during-scan | 0.80 | equal | RaBitQ and Caustic |
| Post-filtering | 0.14 | equal | RaBitQ and Caustic |
Method
Measured on the large-filter branch — the path production actually takes — at an equal scan budget for both strategies. The comparison axis is recall@10 at fixed budget; the baseline is equal-budget post-filtering.
How to read these numbers
Every multiple names its axis
"~125x less" means resident memory as a fraction of raw f32, against the previous RAM HashMap. "~28x" means p50 tenant-scoped read latency at 1M background entities, against the same engine with the index off. A multiple without both is not a result.
Synthetic corpora are labelled
The Caustic and Lodestar figures are from synthetic corpora and say so. Real-embedding validation for Caustic is pending. A number measured on generated data is evidence about the engine only once the generator has been ruled out as the thing being measured.
Unmet gates stay visible
The Disk variance gate was not met and the Disk per-kind index is default-off as a result. That is on this page, in the same section as the 33x figure, because a caveat nobody reads is not a caveat.
Vocabulary for the named guarantees above is on the glossary; the testing discipline that produced them is on reliability; the dated entries are on the changelog.