Odin portable · 55.4–59.3 M/s
The four payload fixtures span 16.87–18.06 ns/record. The classifier touches bounded headers rather than walking the payload body; fixture-to-fixture variation is not payload bandwidth.
Measured, not marketed
C, typed Nelua, and Odin walk the same caller-owned SDB1 bytes through the same fixed-width ABI. The result is workload-specific: Odin leads complete valid-packet classification here, while Nelua leads the scan rows and C remains close on the alignment and malformed rings. The measured valid scan/classifier paths recorded zero allocator activity across the six intercepted APIs.
One honest machine snapshot
31 CPU-pinned samples per row on an Intel i5-10400 Alpine worker. Lower latency is better. Timing never gates CI, and this is not a NIC or cryptographic benchmark.
The four payload fixtures span 16.87–18.06 ns/record. The classifier touches bounded headers rather than walking the payload body; fixture-to-fixture variation is not payload bandwidth.
It records 13.72 ns/record; C tuned follows at 13.75 ns, tuned Nelua at 13.96 ns, and tuned Odin at 14.34 ns. The same Nelua portable lane leads the separate hot scan at 13.46 ns.
Its malformed-ring p50 batch mean is 5.64 ns/record, with C portable at 5.82 ns/record. Every entry is non-OK, including payload- and record-limit rejection.
Odin tuned leads the mixed classifier at about 7.69 ns and improves Odin’s hot/alignment scans, yet regresses its malformed scan and payload-0 valid from 18.06 to 18.16 ns. This sequential snapshot is observational, not a universal compiler verdict.
Ownership made visible
The harness wraps malloc, calloc, realloc, aligned_alloc, posix_memalign, and free. Odin also builds with a panic allocator; both language objects have no undefined symbols.
Size without sleight of hand
Each implementation now has its own object; the identical timing harness is excluded. Maintained source, generated C, object file, size-reported text aggregate, and exact exported symbols remain separate quantities.
.text section. C source bytes are intentionally blank because its implementation spans the wrapper and shared wire header; the raw input manifest records both. None of these numbers includes crypto or application policy.Kernel boundary
The official Odin compiler has no supported BPF/eBPF target. Retargeting x86 LLVM IR would discard the supported ABI and verifier contract, so the site marks that cell not applicable.
xdp sectionrecord + 64 bounds-check pattern observednot_run; userspace must still verify the MAC/signature and complete policy.