# Language benchmark results

This report is rendered deterministically from measured JSON. Each timing sample is one batch average normalized to nanoseconds per operation; percentiles therefore describe run-to-run dispersion of batch means, not per-operation tail latency. Raw samples marked as CPU migrations are counted but excluded. Throughput is the median of the usable per-sample rates. No performance threshold or unmeasured result is inferred.

## Implementations

| Implementation | Identifier | Available | Color |
| --- | --- | --- | --- |
| C reference (portable) | `c-portable` | yes | `#2563eb` |
| Nelua (portable) | `nelua-portable` | yes | `#0f766e` |
| Odin (portable) | `odin-portable` | yes | `#c2410c` |
| C reference (tuned) | `c-tuned` | yes | `#7c3aed` |
| Nelua (tuned) | `nelua-tuned` | yes | `#be123c` |
| Odin (tuned) | `odin-tuned` | yes | `#475569` |

## Run context

| Field | Value |
| --- | --- |
| Commit | 57149526458db906655dcc39a12244e3e096083e |
| Tree state | clean |
| Compiler | cc (Alpine 15.2.0) 15.2.0 |
| Cpu | Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz |
| Measured at utc | 2026-08-24T22:16:21Z |
| Host | sdb1-redteam-20260824 |
| Kernel | 6.18.42-0-lts |
| Machine | x86_64 |
| Os | Alpine Linux edge |
| Run id | signed-data-language-20260824-v2 |

## Measured input manifest

| Path | Bytes | SHA-256 |
| --- | ---: | --- |
| `bench/include/sdb1_bench_abi.h` | 3,913 | `204561ae8fb37dad341eb4b7fe397bc4fded526faefedf6674973ecf23df9416` |
| `bench/src/alloc_wrap.c` | 3,014 | `8460688f84a74118e4eb8cdd451707d83e8a2aad0ee877e88512797fd9bec6b3` |
| `bench/src/c_reference.c` | 5,898 | `e1536968f9f056df27d32132a45bae4ea7fae268479b9fe4207fd33f3e1f98f4` |
| `bench/src/driver.c` | 58,128 | `cc2e93951bcfbbd466d8512e4e05d6efcdfdaec6b979630240078582cc35a937` |
| `examples/nelua-toolchain.env` | 356 | `78ff7219f08fa7f55d340bb140ca8f75fe2b2ab81aa84561df5f863192b4f0e6` |
| `examples/odin-toolchain.env` | 667 | `73d67e9f15fb4ba54abcd0a007ab010cf79cb7a457e21e42357467dc6942b22e` |
| `examples/sdb1_udp_classifier.NELUA_PROVENANCE.txt` | 583 | `4998e46b247e274db31a95213d9d0757c3033ef92ad70bfdf78dee182610b5e8` |
| `examples/sdb1_udp_classifier.ODIN_PROVENANCE.txt` | 1,019 | `7c61edb82ad369fcf2aaa2269f4047ef7b906b0ac3753c807878e7a1bd3c03e6` |
| `examples/sdb1_udp_classifier.c` | 16,859 | `bc50389d42bcedf07ad5f93bb4e46880cce61a623d0758dc6e45052a06743632` |
| `examples/sdb1_udp_classifier.nelua` | 16,372 | `78491b8d6775a3d857768b3bb632d6e0cb17a17afe213b9979d32b482e4c18a3` |
| `examples/sdb1_udp_classifier.odin` | 13,712 | `020790008b9832a4965386e37ab3304a87ad3d24c5d70159ecd1a86c0592da38` |
| `examples/xdp_sdb1_redirect.NELUA_PROVENANCE.txt` | 596 | `a6800834f51ff2887b9963836fe6abacfe514f91dbdf6acd07993f735132577d` |
| `examples/xdp_sdb1_redirect.c` | 8,969 | `7df918d0d62b69a50cb4ca41774f42e173ecdd1e8ec366030d480f419ecb5c75` |
| `examples/xdp_sdb1_redirect.nelua` | 7,675 | `a2d919a3fb45745977984fd96310b88d2a1d528377e00faf50cc770c578d8078` |
| `include/signed_data_classifier.h` | 4,129 | `88c4712d5f14f33b14c6e2518d4c0a034fb54b298b9cb4b1aa47c2dfc103b91e` |
| `include/signed_data_wire.h` | 19,320 | `e01a5aab18082fb33a507d5970d5797970544365d242919556b7456176943904` |
| `script/bootstrap-odin.rb` | 4,608 | `b422681e1c2ab5f592849f6d233bf768cb2aaca57c2dab830b58928469cc2131` |
| `script/check-language-examples.rb` | 6,867 | `982c7f8b05faf33662cdb4ffd303584d13bac1cc54d4366f42341fab59d9954c` |
| `script/check-nelua-examples.rb` | 4,632 | `4049f3a8f09006aeb1b8dd9d8fa67c3f49d2c9a20c98daef20e6fbfb012ff7e1` |
| `script/render-language-benchmarks.rb` | 68,875 | `2b53d549f0e395537542f63d83d55bbc2db07105215d1265cf3fb921a0802d88` |
| `script/run-language-benchmarks.rb` | 33,485 | `92b5a1021f4387149010c6658e2b4ac5bfdf28b4976a05d092f1d6fa027db782` |
| `script/strict-json.rb` | 374 | `8591529063731df840491ebfb4d795a456c71a66f1cd1bb82082a29884f5ad4b` |
| `script/verify-language-benchmark-snapshot.rb` | 29,371 | `d1e9fb781c992de8b1bfe7e6a76d534a403dd17456d022e1e47e9120366b7bb5` |

## Toolchains

| Toolchain | Field | Value |
| --- | --- | --- |
| c | binary_sha256 | `62547cb8152392a089bccda18cd7e152680e06e595add701129372afab5a5f53` |
| c | command | `/usr/bin/cc` |
| c | version | `cc (Alpine 15.2.0) 15.2.0` |
| nelua | commit | `a58450563e2d2ec49bff499865c8b5cfdf6ff81a` |
| nelua | generated_c_sha256 | `bc50389d42bcedf07ad5f93bb4e46880cce61a623d0758dc6e45052a06743632` |
| nelua | generator_cc | `clang` |
| nelua | generator_options | `-r -c -P noentrypoint -P nogc -P nochecks` |
| nelua | host_target | `x86_64-linux-musl-host` |
| nelua | version | `0.2.0-dev.1635+a5845056` |
| object_tools | nm_binary_sha256 | `1254b8eb47d8449b76e52fb3f66463164781018024cd86062c98fd258561b863` |
| object_tools | nm_command | `/usr/bin/nm` |
| object_tools | nm_version | `GNU nm (GNU Binutils) 2.45.1` |
| object_tools | size_binary_sha256 | `db8db15f79256aa90c31ef20b44f693cddc8f570fc9901331c07dbbf0e40f013` |
| object_tools | size_command | `/usr/bin/size` |
| object_tools | size_version | `GNU size (GNU Binutils) 2.45.1` |
| odin | binary_sha256 | `26d82115fa7d8a539867e5442a2f61e3e9e8381918b4c67c16ab11ae2613a5f4` |
| odin | embedded_commit | `902106fc64f1b7adb0cbf083ce4643db1c945e5f` |
| odin | llvm | `20.1.8` |
| odin | release_asset_attested | `true` |
| odin | release_asset_sha256 | `d858c0a182bb28d7b04b04dbb8aed592a9c96c84e4400ee917c74b45848a4d87` |
| odin | release_asset_url | `https://github.com/odin-lang/Odin/releases/download/dev-2026-08/odin-linux-amd64-dev-2026-08.tar.gz` |
| odin | reported_version | `dev-2026-08-nightly:902106f` |

## Method

| Field | Value |
| --- | --- |
| allocation_iterations | `1000000` |
| clock | `CLOCK_MONOTONIC_RAW` |
| cpu | `0` |
| harness | `C11 -O3 -fno-stack-protector in both lanes` |
| iterations_per_sample | `100000` |
| locale | `LC_ALL=C; LANG=C` |
| mode_order | `portable then tuned; cross-mode deltas are observational` |
| portable | `C reference and Nelua-generated C: -O3 -fno-stack-protector; Odin: -o:speed` |
| raw_sample_unit | `integer elapsed_ns per batch; ns/op derived using iterations_per_sample` |
| samples_per_row | `31` |
| timing_thresholds_gate_ci | `false` |
| tuned | `C reference and Nelua-generated C: -O3 -fno-stack-protector -march=native; Odin: -o:aggressive -microarch:native` |
| warmup_iterations | `10000` |

## Correctness

| Lane | Field | Value |
| --- | --- | --- |
| portable | alignments | `64` |
| portable | assertions | `30841` |
| portable | classifier_cases | `20` |
| portable | failures | `0` |
| portable | mutation_cases | `4096` |
| portable | ok | `true` |
| portable | scan_status_cases | `17` |
| tuned | alignments | `64` |
| tuned | assertions | `30841` |
| tuned | classifier_cases | `20` |
| tuned | failures | `0` |
| tuned | mutation_cases | `4096` |
| tuned | ok | `true` |
| tuned | scan_status_cases | `17` |

## eBPF artifact scope

| Implementation | Field | Value |
| --- | --- | --- |
| nelua-generated-c-xdp | status | `artifact_inspected` |
| nelua-generated-c-xdp | compiler | `Alpine clang version 22.1.8` |
| nelua-generated-c-xdp | compiler_binary_sha256 | `d9a7ee3eaeb4096eec0b59ad5a0b468f99486f403235236ee89c73f0c325c038` |
| nelua-generated-c-xdp | inspector | `LLVM version 22.1.8` |
| nelua-generated-c-xdp | inspector_binary_sha256 | `ded599b639706a038850c29eaa601ce0c7b07811afb4811884c907feb6843677` |
| nelua-generated-c-xdp | object_bytes | `23616` |
| nelua-generated-c-xdp | xdp_section_bytes | `3784` |
| nelua-generated-c-xdp | encoded_instruction_slots | `473` |
| nelua-generated-c-xdp | maximum_observed_stack_bytes | `432` |
| nelua-generated-c-xdp | internal_call_relocation | `false` |
| nelua-generated-c-xdp | fixed_header_bounds_pattern_observed | `true` |
| nelua-generated-c-xdp | kernel_verifier_status | `not_run` |
| nelua-generated-c-xdp | nic_status | `not_run` |
| odin | status | `not_applicable` |
| odin | reason | `official Odin compiler has no supported BPF/eBPF target` |

## Throughput and latency

| Lane | Workload | Cache shape | Implementation | Usable samples | CPU migrations | p05 batch-mean ns/op | p50 batch-mean ns/op | p95 batch-mean ns/op | p99 batch-mean ns/op | p50 M records/s |
| --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| abi-call/classify | classify_mixed_ring | ring-32k | C reference (portable) | 31 | 0 | 9.267 | 9.295 | 9.365 | 9.449 | 107.589 |
| abi-call/classify | classify_mixed_ring | ring-32k | Nelua (portable) | 31 | 0 | 8.648 | 8.671 | 8.881 | 9.936 | 115.333 |
| abi-call/classify | classify_mixed_ring | ring-32k | Odin (portable) | 31 | 0 | 8.321 | 8.448 | 8.487 | 8.678 | 118.371 |
| abi-call/classify | classify_mixed_ring | ring-32k | C reference (tuned) | 31 | 0 | 9.145 | 9.239 | 9.313 | 9.982 | 108.237 |
| abi-call/classify | classify_mixed_ring | ring-32k | Nelua (tuned) | 31 | 0 | 8.073 | 8.086 | 8.989 | 9.032 | 123.670 |
| abi-call/classify | classify_mixed_ring | ring-32k | Odin (tuned) | 31 | 0 | 7.684 | 7.694 | 8.403 | 8.662 | 129.969 |
| abi-call/classify | classify_payload_0 | hot | C reference (portable) | 31 | 0 | 25.492 | 25.981 | 26.674 | 27.769 | 38.489 |
| abi-call/classify | classify_payload_0 | hot | Nelua (portable) | 31 | 0 | 25.678 | 26.013 | 27.266 | 42.757 | 38.443 |
| abi-call/classify | classify_payload_0 | hot | Odin (portable) | 31 | 0 | 17.628 | 18.065 | 18.467 | 18.611 | 55.356 |
| abi-call/classify | classify_payload_0 | hot | C reference (tuned) | 31 | 0 | 26.087 | 26.384 | 28.947 | 30.244 | 37.902 |
| abi-call/classify | classify_payload_0 | hot | Nelua (tuned) | 31 | 0 | 25.558 | 25.569 | 27.282 | 27.470 | 39.109 |
| abi-call/classify | classify_payload_0 | hot | Odin (tuned) | 31 | 0 | 18.150 | 18.164 | 20.074 | 21.436 | 55.052 |
| abi-call/classify | classify_payload_64 | hot | C reference (portable) | 31 | 0 | 25.740 | 25.979 | 31.860 | 36.087 | 38.493 |
| abi-call/classify | classify_payload_64 | hot | Nelua (portable) | 31 | 0 | 25.093 | 25.703 | 31.347 | 50.907 | 38.905 |
| abi-call/classify | classify_payload_64 | hot | Odin (portable) | 31 | 0 | 16.444 | 16.875 | 17.745 | 24.390 | 59.258 |
| abi-call/classify | classify_payload_64 | hot | C reference (tuned) | 31 | 0 | 26.258 | 26.747 | 39.538 | 53.346 | 37.388 |
| abi-call/classify | classify_payload_64 | hot | Nelua (tuned) | 31 | 0 | 25.569 | 26.192 | 36.461 | 48.194 | 38.180 |
| abi-call/classify | classify_payload_64 | hot | Odin (tuned) | 31 | 0 | 18.163 | 18.603 | 29.728 | 39.032 | 53.756 |
| abi-call/classify | classify_payload_512 | hot | C reference (portable) | 31 | 0 | 25.353 | 25.981 | 36.089 | 49.106 | 38.489 |
| abi-call/classify | classify_payload_512 | hot | Nelua (portable) | 31 | 0 | 25.386 | 26.006 | 43.211 | 54.923 | 38.453 |
| abi-call/classify | classify_payload_512 | hot | Odin (portable) | 31 | 0 | 17.624 | 18.048 | 37.467 | 45.387 | 55.408 |
| abi-call/classify | classify_payload_512 | hot | C reference (tuned) | 31 | 0 | 26.084 | 26.740 | 28.769 | 28.993 | 37.397 |
| abi-call/classify | classify_payload_512 | hot | Nelua (tuned) | 31 | 0 | 25.568 | 26.192 | 26.873 | 27.575 | 38.179 |
| abi-call/classify | classify_payload_512 | hot | Odin (tuned) | 31 | 0 | 18.159 | 18.602 | 19.884 | 20.781 | 53.758 |
| abi-call/classify | classify_payload_1376 | hot | C reference (portable) | 31 | 0 | 25.961 | 26.130 | 27.913 | 35.927 | 38.270 |
| abi-call/classify | classify_payload_1376 | hot | Nelua (portable) | 31 | 0 | 25.693 | 25.704 | 26.604 | 31.655 | 38.905 |
| abi-call/classify | classify_payload_1376 | hot | Odin (portable) | 31 | 0 | 16.841 | 16.871 | 18.843 | 21.604 | 59.275 |
| abi-call/classify | classify_payload_1376 | hot | C reference (tuned) | 31 | 0 | 26.086 | 26.118 | 28.721 | 29.095 | 38.288 |
| abi-call/classify | classify_payload_1376 | hot | Nelua (tuned) | 31 | 0 | 25.558 | 25.642 | 27.652 | 28.659 | 38.999 |
| abi-call/classify | classify_payload_1376 | hot | Odin (tuned) | 31 | 0 | 18.150 | 18.165 | 19.580 | 19.934 | 55.052 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | C reference (portable) | 31 | 0 | 13.653 | 13.984 | 14.941 | 15.364 | 71.508 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | Nelua (portable) | 31 | 0 | 13.394 | 13.721 | 13.934 | 14.422 | 72.878 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | Odin (portable) | 31 | 0 | 14.167 | 14.522 | 15.452 | 15.815 | 68.862 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | C reference (tuned) | 31 | 0 | 13.634 | 13.754 | 14.188 | 14.506 | 72.708 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | Nelua (tuned) | 31 | 0 | 13.943 | 13.962 | 14.820 | 31.347 | 71.621 |
| abi-call/scan_fixed | scan_alignment_ring | ring-10k | Odin (tuned) | 31 | 0 | 14.324 | 14.344 | 16.132 | 25.315 | 69.715 |
| abi-call/scan_fixed | scan_hot | hot | C reference (portable) | 31 | 0 | 13.377 | 13.710 | 13.980 | 15.501 | 72.939 |
| abi-call/scan_fixed | scan_hot | hot | Nelua (portable) | 31 | 0 | 13.138 | 13.459 | 13.907 | 14.374 | 74.301 |
| abi-call/scan_fixed | scan_hot | hot | Odin (portable) | 31 | 0 | 13.693 | 14.026 | 14.748 | 15.090 | 71.295 |
| abi-call/scan_fixed | scan_hot | hot | C reference (tuned) | 31 | 0 | 13.144 | 13.568 | 29.974 | 32.797 | 73.705 |
| abi-call/scan_fixed | scan_hot | hot | Nelua (tuned) | 31 | 0 | 13.387 | 13.723 | 33.485 | 33.601 | 72.873 |
| abi-call/scan_fixed | scan_hot | hot | Odin (tuned) | 31 | 0 | 13.623 | 13.958 | 33.991 | 85.808 | 71.643 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | C reference (portable) | 31 | 0 | 5.812 | 5.823 | 5.911 | 5.968 | 171.740 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | Nelua (portable) | 31 | 0 | 5.630 | 5.641 | 5.659 | 5.690 | 177.280 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | Odin (portable) | 31 | 0 | 6.026 | 6.038 | 6.308 | 7.002 | 165.608 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | C reference (tuned) | 31 | 0 | 5.906 | 5.923 | 6.009 | 6.399 | 168.843 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | Nelua (tuned) | 31 | 0 | 5.989 | 6.009 | 6.024 | 6.444 | 166.407 |
| abi-call/scan_fixed | scan_malformed_ring | ring-2k | Odin (tuned) | 31 | 0 | 6.160 | 6.176 | 6.553 | 6.965 | 161.915 |

## Allocations

| Lane | Workload | Cache shape | Implementation | Instrumented | Measured | Zero | Operations | Calls | Requested bytes | Calls/op | Bytes/op | Frees | Peak live bytes | Retained bytes |
| --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| abi-call | scan+classify valid record | hot | C reference (portable) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |
| abi-call | scan+classify valid record | hot | Nelua (portable) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |
| abi-call | scan+classify valid record | hot | Odin (portable) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |
| abi-call | scan+classify valid record | hot | C reference (tuned) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |
| abi-call | scan+classify valid record | hot | Nelua (tuned) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |
| abi-call | scan+classify valid record | hot | Odin (tuned) | yes | yes | yes | 2,000,000 | 0 | 0 | 0 | 0 | 0 | — | — |

## Code size

Maintained source, generated C, object files, size-reported text aggregates, exported symbols, and executables are separate measurements and are not summed.

The C reference maintained-source cell is intentionally blank because its implementation spans `bench/src/c_reference.c` and the shared `include/signed_data_wire.h`; the input manifest records both components' exact byte counts and SHA-256 digests.

| Implementation | Maintained source (bytes) | Generated C (bytes) | Object file (bytes) | Size-reported text aggregate (bytes) | Exported symbol (bytes) |
| --- | ---: | ---: | ---: | ---: | ---: |
| C reference (portable) | — | — | 3,504 | 2,191 | 1,959 |
| Nelua (portable) | 16,372 | 16,859 | 5,960 | 3,614 | 3,087 |
| Odin (portable) | 13,712 | — | 7,840 | 5,631 | 2,354 |
| C reference (tuned) | — | — | 3,680 | 2,111 | 1,859 |
| Nelua (tuned) | 16,372 | 16,859 | 6,192 | 3,659 | 3,106 |
| Odin (tuned) | 13,712 | — | 9,736 | 5,948 | 2,516 |
