One perf record at 9999 Hz per test, full sizes, recorded 2026-09-19 at commit 9f0fdab. Whole process, startup and untimed passes included. Hover shows each frame’s CPU time (samples ÷ 9,999 Hz); kernel frames end in _[k]. Rust is built with frame pointers for complete stacks. Rust async fn bodies (f::{closure#0}) are shown as f; the closures and Go gowrap wrappers that only start a thread or goroutine are hidden.
Numbers are medians from the benchmark run full-20260919-182448 (commit 9f0fdab); each links to its flame graph.
| Test | Tokio | Tuned Tokio, Tokio channels | Tuned Tokio | Crossbeam | Go | Unit |
|---|---|---|---|---|---|---|
| 1 sender → 1 receiver, capacity 1024 | 13.2M | 23.8M | 137M | 38.3M | 29.6M | messages/s |
| 1 sender → 1 receiver, capacity 1 | 5.13M | 5.12M | 20.5M | 6.76M | 11.3M | messages/s |
| 4 senders → 1 receiver, capacity 1024 | 8.81M | 7.07M | 104M | 35.4M | 25.9M | messages/s |
| 4 senders → 1 receiver, capacity 1 | 5.00M | 4.92M | 20.0M | 5.74M | 10.1M | messages/s |
| 4 senders → 4 receivers, capacity 1024 | 9.32M (async-channel) | 9.21M (async-channel) | 81.0M | 23.3M | 18.7M | messages/s |
| 4 senders → 4 receivers, capacity 1 | 2.03M (async-channel) | 1.93M (async-channel) | 19.4M | 5.17M | 6.87M | messages/s |
| Ping-pong | 4.46M | 4.35M | 7.51M | 3.86M | 4.03M | round trips/s |
| Spawn and join, 1M tasks | 4.05M | 5.44M | 5.41M | 29.2K at 10K | 6.48M | tasks/s |
| CPU-heavy hashing | 116M | 116M | 115M | 114M | 108M | items/s |
| Select over 2 channels, capacity 1024 | 20.6M | 40.6M | 40.6M | 13.8M | 13.9M | messages/s |
| Select over 2 channels, capacity 1 | 5.96M | 5.34M | 5.37M | 7.37M | 7.30M | messages/s |
| Lock contention, 8 workers | 9.78M | 81.9M | 80.0M | 31.9M | 25.6M | increments/s |