Processes + sockets
Both peers must exit naturally with code zero, their exact process IDs must be absent, and the endpoint must bind again.
One shared TCP contract
The release harness measures the same validated framed round trip with each runtime acting as client and server. Timing, memory, package size, provenance, and cleanup stay visible without turning smoke output into evidence.
GitHub Actions run 32622520570 recorded Windows, Linux, and macOS at commit 2692d32 with Node.js 24.18.1 and Rust 1.85.0. All 60 fresh process pairs exited naturally; zero active processes, sockets, forced terminations, or temporary entries remained.
| Platform | Node → Node | Node → Rust | Rust → Node | Rust → Rust |
|---|---|---|---|---|
| Linux · x64 | 10,312 ms | 9,317 ms | 16,816 ms | 12,478 ms |
| macOS · arm64 | 7,817 ms | 7,368 ms | 8,165 ms | 5,596 ms |
| Windows · x64 | 12,609 ms | 15,231 ms | 23,186 ms | 13,070 ms |
Each value is the median of five samples. Quick-smoke timings are excluded.
| Lane | Client | Server | Purpose |
|---|---|---|---|
node-node | Node.js | Node.js | Same-runtime Node.js control |
node-rust | Node.js | Rust | Node.js client interoperability |
rust-node | Rust | Node.js | Rust client interoperability |
rust-rust | Rust | Rust | Same-runtime Rust control |
Lane names always read client → server. Each sample starts a fresh release-built client, server, loopback port, and temporary directory.
| Setting | Value |
|---|---|
| Warm-up | 100,000 validated round trips |
| Measured work | 1,000,000 validated round trips; 2,000,000 application frames |
| Payload | 64 deterministic bytes |
| Maximum in flight | 64 |
| Samples | 5 per lane; 20 fresh process pairs |
| Toolchains | Node.js 24.18.1 and Rust 1.85.0 |
Compilation, startup, warm-up, package measurement, parent garbage collection, and cleanup remain outside it. Every response is still checked for type, payload, sequence, count, and wire bytes.
Both peers must exit naturally with code zero, their exact process IDs must be absent, and the endpoint must bind again.
Child RSS is sampled with the native platform facility and labelled as a sampled maximum, not an exact lifetime peak.
npm pack --dry-run and cargo package report compressed bytes, unpacked npm bytes, file counts, and hashes.
Every peer-specific directory must be empty and removed. A forced termination or sampler failure rejects full evidence.
| Platform | Node client / server | Rust client / server | npm packed / unpacked | crate packed |
|---|---|---|---|---|
| Linux | 118.9 / 69.3 MiB | 17.3 / 2.3 MiB | 26.2 / 98.2 KiB | 55.6 KiB |
| macOS | 114.9 / 66.4 MiB | 16.8 / 1.8 MiB | 26.2 / 98.2 KiB | 55.6 KiB |
| Windows | 103.4 / 54.2 MiB | 19.2 / 4.4 MiB | 26.4 / 101.1 KiB | 56.3 KiB |
RSS rows use the Node→Node and Rust→Rust controls. Package values are the exact dry-run artifacts at measured commit 2692d32; later evidence-only documentation can change package bytes without changing the measured runtime. Runner checkout representation also causes small platform differences. Every raw record retains exact bytes, file counts, and hashes.
npm run benchmark:rust:test
npm run benchmark:rust:quick
# Official CI only; requires a clean main checkout.
npm run benchmark:rust:record -- --output-directory=<artifact-directory>Quick mode validates all four lanes with a small workload and explicitly disables performance claims. The official workflow records the full configuration on each supported operating system and uploads sanitized JSON for strict three-platform merge.
These results compare one framed TCP workload on the named hosted runner, commit, architecture, and exact toolchains. They are not a universal language ranking, certification, browser claim, or substitute for an application-specific benchmark.