The named-corpus performance and peak-memory harness is accepted as the Windows measurement baseline. It closes the implementation and local evidence portion of the Phase 1 corpus-measurement task. Release floors remain unratified until an independent Linux run reproduces the harness and the parser promotion review accepts explicit budgets.
/proc high-water marks on
Linux.
| Tier | Input | Operation | Best time | Peak RSS | Peak/input |
|---|---|---|---|---|---|
| Small footprint | 7,977 B | Parse | 0.293 ms | 4.35 MiB | baseline dominated |
| Small footprint | 7,977 B | Roundtrip | 0.486 ms | 4.32 MiB | baseline dominated |
| Medium schematic | 996,306 B | Parse | 9.885 ms | 12.91 MiB | 13.58x |
| Medium schematic | 996,306 B | Roundtrip | 34.635 ms | 24.73 MiB | 26.03x |
| Large board | 71,556,836 B | Parse | 584.927 ms | 506.58 MiB | 7.42x |
| Large board | 71,556,836 B | Roundtrip | 2,247.323 ms | 1,136.86 MiB | 16.66x |
These values came from Windows 11 on an AMD64 32-logical-CPU host using Rust 1.95.0. They are evidence from one run series, not portable limits.
Throughput is already useful, but full generic-tree memory is material. The large parse-only path peaks at about 7.4 times input size, while the two-tree oracle intentionally reaches about 16.7 times input size. This supports the existing architecture decision: the generic tree remains a compatibility and validation path, while promoted converters and typed readers must use selective spans or direct typed views rather than allocating the complete generic tree.
A separate non-default measurement feature times form discovery and the final source-order sort independently. Five release runs per scanner and corpus tier show that sorting is material on the large board:
| Tier | Selected forms | Scanner | Best scan | Best sort | Sort fraction |
|---|---|---|---|---|---|
| Small | 350 | Memory | 0.121 ms | 0.017 ms | 12.4% |
| Small | 350 | Stream | 0.173 ms | 0.018 ms | 9.6% |
| Medium | 41,192 | Memory | 15.438 ms | 1.496 ms | 8.8% |
| Medium | 41,192 | Stream | 19.040 ms | 1.554 ms | 7.5% |
| Large | 2,124,874 | Memory | 772.026 ms | 166.160 ms | 17.7% |
| Large | 2,124,874 | Stream | 1,021.759 ms | 165.172 ms | 13.9% |
This cost is recorded in a focused backlog issue for possible source-order
emission without the final O(k log k) sort. It does not block
the current functional port; the parser promotion review should promote
the optimization only if ratified budgets or a real consumer workload
require it.
GitHub issue #75 was implemented as two private, independently measured changes without altering the public parser or projection contracts. The lexer now scans structural ASCII and token runs by byte while preserving Unicode-scalar columns. Projection frames borrow unquoted in-memory heads and derive paths from the active stack; owned public heads and paths are created only for selected forms. The streaming scanner retains only the owned active heads required after input chunks are discarded.
Same-host evidence used clean exact commits B0
72dea9973eade13034ef043dd62792006fda9722, lexer L
beb40f62abab2e6f64f3daaab36f14899114bf8e, and final P
697a685ef0843dc0b6a73e8288e1599a049d93d4. Harnesses,
inputs, features, release settings, locks, binaries, raw rounds, and host
provenance were retained for each comparison.
| Gate | Observed result | Decision |
|---|---|---|
| B0 to L lexer | 2.302x median; 2.292x 95% sign-interval lower bound | Pass |
| L to P sparse memory time | 5.053x median; 5.035x lower bound | Pass |
| L to P sparse stream time | 2.740x median; 2.704x lower bound | Pass |
| L to P memory allocations | 1,600,631 to 628 calls; 99.96% reduction | Pass |
| L to P stream allocations | 1,600,632 to 300,630 calls; 81.22% reduction | Pass |
| L to P select-all | 1.043x to 1.188x median across all tiers/scanners | Pass |
| B0 to P native Speedy | 7.618 s to 5.028 s median; 1.515x improvement | Pass |
The final three-round Speedy run retained semantic parity for all 35 structured/report artifacts and all 29 SVGs, left the reviewed source tree unchanged, and measured the Rust path at 15.44x the Python median. The three paired B0-to-P Rust ratios were 1.479x, 1.515x, and 1.578x. Shared Python/Rust span vectors, exact memory/stream resource boundaries, full locked workspace tests, real Node-hosted WASM, reviewed-corpus roundtrip/determinism, Cruncher source-install behavior, and repository audits passed.
These values accept the byte lexer and allocation-light projection
representation on this host; they are not portable service-level
guarantees. A borrowed public tree, selector trie, final-sort removal,
memchr, direct typed parsing, and a Python lexer rewrite
remain separately scoped work.