Repository navigation
Conversation
A receiver only has to reassemble 576 bytes for IPv4 and 1500 bytes for IPv6, and may silently discard a larger fragmented datagram. Present fragmentation as a correctness hazard rather than only a cost of losing a fragment. Refs cppalliance#353
Add style guide rule D6 so examples follow the lifetime rules: a coroutine started with run_async takes by value whatever it reads after it suspends, and references only what outlives run(). Point the Dangling References section at the Lifetime and Teardown page. Refs cppalliance#353
The state list read as one linear path, but closing branches on which side sends the first FIN. Add a figure of the closing paths, a short explanation of them, and the CLOSING state of a simultaneous close, which the list left out. Refs cppalliance#353
The class docs said operations resume coroutines "on the correct executor" without saying which one. Say it: the awaiting coroutine's own executor, not the executor of the context that owns the I/O object. Add the rule to io_object as an Executor Affinity paragraph, as style guide rule D4 asks. Refs cppalliance#353
Running coroutines elsewhere and calling into the context only for I/O would cost a queue and a cross-thread wakeup on every completion. Keeping both in one place lets dispatch resume the awaiting coroutine inline by symmetric transfer. Say so in the I/O Context guide. Refs cppalliance#353
compute_fnv1a used no coroutine machinery and was a task only so it could be handed to capy::run directly. Make it a plain, reusable function and wrap it in a coroutine lambda at the call site, passing the buffer as parameters rather than captures. Update the tutorial to match. Refs cppalliance#353
|
An automated preview of the documentation is available at https://412.corosio.prtest3.cppalliance.org/index.html If more commits are pushed to the pull request, the docs will rebuild at the same URL. 2026-11-09 17:25:36 UTC |
|
GCOVR code coverage report https://412.corosio.prtest3.cppalliance.org/gcovr/index.html Build time: 2026-11-09 17:39:55 UTC |
Benchmark report
|
| Platform | Backend | Benchmark | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|---|
| windows | iocp | socket_throughput/bidirectional/1048576 | bytes_per_sec | 5.73 GB/s | 4.78 GB/s | 🔴▼ -17.34% | 4.45% |
linux — full results (226 benchmarks, 5 iterations, 1.5s each)
accept_churn
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| burst/10 | epoll | ops_per_sec | 2.01K ops/s | 2.01K ops/s | 🔴▼ -0.17% | 0.94% |
| burst/10 | uring | ops_per_sec | 1.87K ops/s | 1.87K ops/s | 🔴▼ -0.03% | 0.20% |
| burst/100 | epoll | ops_per_sec | 203.4 ops/s | 203.2 ops/s | 🔴▼ -0.33% | 0.94% |
| burst/100 | uring | ops_per_sec | 193.1 ops/s | 193.5 ops/s | 🟢▲ +0.22% | 0.62% |
| burst_lockless/10 | epoll | ops_per_sec | 2.03K ops/s | 2.04K ops/s | 🟢▲ +0.13% | 0.99% |
| burst_lockless/10 | uring | ops_per_sec | 2.01K ops/s | 2.01K ops/s | 🟢▲ +0.05% | 0.23% |
| burst_lockless/100 | epoll | ops_per_sec | 205.6 ops/s | 205.6 ops/s | 🟢▲ +0.01% | 1.01% |
| burst_lockless/100 | uring | ops_per_sec | 207.0 ops/s | 206.7 ops/s | 🔴▼ -0.05% | 0.44% |
| concurrent/1 | epoll | ops_per_sec | 15.88K ops/s | 15.94K ops/s | 🟢▲ +0.26% | 1.25% |
| concurrent/1 | uring | ops_per_sec | 13.95K ops/s | 13.97K ops/s | 🟢▲ +0.13% | 0.36% |
| concurrent/16 | epoll | ops_per_sec | 15.93K ops/s | 15.93K ops/s | 🔴▼ -0.09% | 0.91% |
| concurrent/16 | uring | ops_per_sec | 13.92K ops/s | 13.92K ops/s | 🔴▼ -0.12% | 0.39% |
| concurrent/4 | epoll | ops_per_sec | 15.98K ops/s | 15.95K ops/s | 🔴▼ -0.15% | 1.50% |
| concurrent/4 | uring | ops_per_sec | 13.92K ops/s | 13.91K ops/s | 🔴▼ -0.17% | 0.46% |
| sequential | epoll | ops_per_sec | 15.84K ops/s | 15.95K ops/s | 🟢▲ +0.58% | 1.28% |
| sequential | uring | ops_per_sec | 13.99K ops/s | 13.98K ops/s | 🔴▼ -0.15% | 0.49% |
| sequential_lockless | epoll | ops_per_sec | 16.05K ops/s | 16.15K ops/s | 🟢▲ +0.13% | 1.53% |
| sequential_lockless | uring | ops_per_sec | 14.95K ops/s | 14.95K ops/s | 🟢▲ +0.02% | 0.31% |
fan_out
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent_parents/1 | epoll | ops_per_sec | 3.69K ops/s | 3.67K ops/s | 🔴▼ -0.07% | 1.05% |
| concurrent_parents/1 | uring | ops_per_sec | 3.45K ops/s | 3.45K ops/s | ⚪ 0.00% | 0.71% |
| concurrent_parents/16 | epoll | ops_per_sec | 3.59K ops/s | 3.56K ops/s | 🟢▲ +0.05% | 1.33% |
| concurrent_parents/16 | uring | ops_per_sec | 3.34K ops/s | 3.32K ops/s | 🔴▼ -0.11% | 0.95% |
| concurrent_parents/4 | epoll | ops_per_sec | 3.59K ops/s | 3.58K ops/s | 🔴▼ -0.07% | 1.04% |
| concurrent_parents/4 | uring | ops_per_sec | 3.37K ops/s | 3.35K ops/s | 🟢▲ +0.04% | 1.11% |
| concurrent_parents_lockless/1 | epoll | ops_per_sec | 3.74K ops/s | 3.73K ops/s | 🟢▲ +0.41% | 1.36% |
| concurrent_parents_lockless/1 | uring | ops_per_sec | 3.49K ops/s | 3.48K ops/s | 🔴▼ -0.11% | 1.01% |
| concurrent_parents_lockless/16 | epoll | ops_per_sec | 3.61K ops/s | 3.62K ops/s | 🟢▲ +0.23% | 1.09% |
| concurrent_parents_lockless/16 | uring | ops_per_sec | 3.37K ops/s | 3.35K ops/s | 🔴▼ -0.12% | 1.06% |
| concurrent_parents_lockless/4 | epoll | ops_per_sec | 3.63K ops/s | 3.63K ops/s | 🟢▲ +0.09% | 1.04% |
| concurrent_parents_lockless/4 | uring | ops_per_sec | 3.40K ops/s | 3.38K ops/s | 🔴▼ -0.14% | 1.10% |
| fork_join/1 | epoll | ops_per_sec | 54.18K ops/s | 54.57K ops/s | 🟢▲ +0.66% | 1.13% |
| fork_join/1 | uring | ops_per_sec | 53.58K ops/s | 53.28K ops/s | 🔴▼ -0.15% | 0.84% |
| fork_join/16 | epoll | ops_per_sec | 3.68K ops/s | 3.70K ops/s | 🟢▲ +0.50% | 1.01% |
| fork_join/16 | uring | ops_per_sec | 3.46K ops/s | 3.45K ops/s | 🔴▼ -0.17% | 0.92% |
| fork_join/4 | epoll | ops_per_sec | 14.59K ops/s | 14.66K ops/s | 🟢▲ +0.48% | 1.17% |
| fork_join/4 | uring | ops_per_sec | 13.80K ops/s | 13.75K ops/s | 🔴▼ -0.16% | 0.97% |
| fork_join/64 | epoll | ops_per_sec | 895.7 ops/s | 900.0 ops/s | 🟢▲ +0.25% | 0.98% |
| fork_join/64 | uring | ops_per_sec | 819.8 ops/s | 815.3 ops/s | 🔴▼ -0.29% | 1.01% |
| fork_join_lockless/1 | epoll | ops_per_sec | 54.76K ops/s | 55.42K ops/s | 🟢▲ +1.00% | 1.13% |
| fork_join_lockless/1 | uring | ops_per_sec | 54.29K ops/s | 54.00K ops/s | 🔴▼ -0.23% | 1.07% |
| fork_join_lockless/16 | epoll | ops_per_sec | 3.71K ops/s | 3.73K ops/s | 🟢▲ +0.21% | 1.05% |
| fork_join_lockless/16 | uring | ops_per_sec | 3.47K ops/s | 3.47K ops/s | 🟢▲ +0.11% | 0.31% |
| fork_join_lockless/4 | epoll | ops_per_sec | 14.67K ops/s | 14.77K ops/s | 🟢▲ +0.33% | 0.97% |
| fork_join_lockless/4 | uring | ops_per_sec | 13.94K ops/s | 13.86K ops/s | 🔴▼ -0.38% | 0.61% |
| fork_join_lockless/64 | epoll | ops_per_sec | 908.2 ops/s | 909.6 ops/s | 🟢▲ +0.26% | 1.00% |
| fork_join_lockless/64 | uring | ops_per_sec | 824.5 ops/s | 825.1 ops/s | ⚪ 0.00% | 0.24% |
| nested/16 | epoll | ops_per_sec | 893.6 ops/s | 887.9 ops/s | 🔴▼ -0.28% | 0.84% |
| nested/16 | uring | ops_per_sec | 804.8 ops/s | 804.8 ops/s | 🟢▲ +0.05% | 0.22% |
| nested/4 | epoll | ops_per_sec | 3.67K ops/s | 3.65K ops/s | 🔴▼ -0.15% | 1.01% |
| nested/4 | uring | ops_per_sec | 3.40K ops/s | 3.41K ops/s | 🟢▲ +0.21% | 0.17% |
| nested_lockless/16 | epoll | ops_per_sec | 901.1 ops/s | 898.9 ops/s | 🟢▲ +0.01% | 0.92% |
| nested_lockless/16 | uring | ops_per_sec | 815.4 ops/s | 816.5 ops/s | 🟢▲ +0.17% | 0.18% |
| nested_lockless/4 | epoll | ops_per_sec | 3.70K ops/s | 3.69K ops/s | 🟢▲ +0.14% | 0.96% |
| nested_lockless/4 | uring | ops_per_sec | 3.44K ops/s | 3.45K ops/s | 🟢▲ +0.13% | 0.17% |
http_server
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | epoll | ops_per_sec | 54.91K ops/s | 55.34K ops/s | 🟢▲ +0.76% | 1.41% |
| concurrent/1 | uring | ops_per_sec | 54.21K ops/s | 53.58K ops/s | 🔴▼ -0.36% | 1.54% |
| concurrent/16 | epoll | ops_per_sec | 57.76K ops/s | 58.35K ops/s | 🟢▲ +0.85% | 1.19% |
| concurrent/16 | uring | ops_per_sec | 53.42K ops/s | 53.11K ops/s | 🔴▼ -0.14% | 1.42% |
| concurrent/32 | epoll | ops_per_sec | 57.17K ops/s | 57.78K ops/s | 🟢▲ +0.50% | 0.97% |
| concurrent/32 | uring | ops_per_sec | 53.13K ops/s | 52.74K ops/s | 🔴▼ -0.05% | 1.51% |
| concurrent/4 | epoll | ops_per_sec | 57.04K ops/s | 57.56K ops/s | 🟢▲ +0.51% | 1.24% |
| concurrent/4 | uring | ops_per_sec | 53.68K ops/s | 53.20K ops/s | 🔴▼ -0.42% | 1.51% |
| multithread/1 | epoll | ops_per_sec | 57.13K ops/s | 57.62K ops/s | 🟢▲ +0.56% | 0.96% |
| multithread/1 | uring | ops_per_sec | 52.90K ops/s | 52.78K ops/s | 🟢▲ +0.27% | 1.11% |
| multithread/16 | epoll | ops_per_sec | 160.4K ops/s | 160.3K ops/s | ⚪ 0.00% | 0.25% |
| multithread/16 | uring | ops_per_sec | 76.07K ops/s | 75.98K ops/s | 🔴▼ -0.28% | 19.59% |
| multithread/2 | epoll | ops_per_sec | 86.08K ops/s | 86.58K ops/s | 🟢▲ +0.77% | 0.60% |
| multithread/2 | uring | ops_per_sec | 90.33K ops/s | 90.60K ops/s | 🟢▲ +0.60% | 1.27% |
| multithread/4 | epoll | ops_per_sec | 157.1K ops/s | 156.9K ops/s | 🔴▼ -0.36% | 0.96% |
| multithread/4 | uring | ops_per_sec | 80.44K ops/s | 80.47K ops/s | 🔴▼ -0.30% | 0.78% |
| multithread/8 | epoll | ops_per_sec | 159.0K ops/s | 159.9K ops/s | 🟢▲ +0.63% | 0.32% |
| multithread/8 | uring | ops_per_sec | 77.90K ops/s | 71.79K ops/s | 🔴▼ -0.30% | 19.47% |
| single_conn | epoll | ops_per_sec | 54.96K ops/s | 55.26K ops/s | 🟢▲ +1.17% | 1.53% |
| single_conn | uring | ops_per_sec | 54.24K ops/s | 53.94K ops/s | 🔴▼ -0.32% | 1.56% |
| single_conn_lockless | epoll | ops_per_sec | 55.62K ops/s | 56.11K ops/s | 🟢▲ +1.04% | 1.47% |
| single_conn_lockless | uring | ops_per_sec | 54.76K ops/s | 54.28K ops/s | 🔴▼ -0.28% | 1.51% |
local_socket_latency
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | epoll | latency_mean_ns | 7.28 µs | 7.14 µs | 🔴▼ -0.10% | 4.04% |
| concurrent/1 | uring | latency_mean_ns | 6.71 µs | 6.63 µs | 🔴▼ -0.25% | 3.08% |
| concurrent/16 | epoll | latency_mean_ns | 109.83 µs | 110.11 µs | 🔴▼ -0.15% | 0.37% |
| concurrent/16 | uring | latency_mean_ns | 108.82 µs | 108.96 µs | 🔴▼ -0.17% | 0.12% |
| concurrent/4 | epoll | latency_mean_ns | 28.02 µs | 27.73 µs | 🟢▲ +0.33% | 1.31% |
| concurrent/4 | uring | latency_mean_ns | 27.22 µs | 27.35 µs | 🔴▼ -0.20% | 1.01% |
| concurrent_lockless/1 | epoll | latency_mean_ns | 7.03 µs | 7.16 µs | 🟢▲ +0.40% | 4.24% |
| concurrent_lockless/1 | uring | latency_mean_ns | 6.87 µs | 6.73 µs | 🟢▲ +0.29% | 5.38% |
| concurrent_lockless/16 | epoll | latency_mean_ns | 108.30 µs | 108.58 µs | 🔴▼ -0.06% | 0.78% |
| concurrent_lockless/16 | uring | latency_mean_ns | 107.82 µs | 108.69 µs | 🔴▼ -0.66% | 0.80% |
| concurrent_lockless/4 | epoll | latency_mean_ns | 27.45 µs | 27.32 µs | 🟢▲ +0.69% | 1.46% |
| concurrent_lockless/4 | uring | latency_mean_ns | 27.08 µs | 26.93 µs | 🟢▲ +0.18% | 1.45% |
| pingpong/1 | epoll | latency_mean_ns | 7.20 µs | 7.08 µs | 🟢▲ +0.33% | 4.65% |
| pingpong/1 | uring | latency_mean_ns | 6.79 µs | 6.57 µs | 🟢▲ +0.07% | 4.83% |
| pingpong/1024 | epoll | latency_mean_ns | 7.76 µs | 7.62 µs | 🟢▲ +6.86% | 4.67% |
| pingpong/1024 | uring | latency_mean_ns | 7.34 µs | 7.21 µs | 🟢▲ +1.10% | 4.96% |
| pingpong/64 | epoll | latency_mean_ns | 7.25 µs | 7.26 µs | 🟢▲ +0.44% | 4.15% |
| pingpong/64 | uring | latency_mean_ns | 6.58 µs | 6.75 µs | 🔴▼ -0.30% | 4.30% |
| pingpong_lockless/1 | epoll | latency_mean_ns | 7.12 µs | 7.10 µs | 🟢▲ +0.65% | 4.30% |
| pingpong_lockless/1 | uring | latency_mean_ns | 6.62 µs | 6.70 µs | 🔴▼ -0.36% | 4.44% |
| pingpong_lockless/1024 | epoll | latency_mean_ns | 7.67 µs | 7.79 µs | 🟢▲ +0.32% | 5.12% |
| pingpong_lockless/1024 | uring | latency_mean_ns | 7.10 µs | 7.24 µs | 🔴▼ -0.07% | 5.20% |
| pingpong_lockless/64 | epoll | latency_mean_ns | 7.02 µs | 7.28 µs | 🟢▲ +0.08% | 5.10% |
| pingpong_lockless/64 | uring | latency_mean_ns | 6.70 µs | 6.60 µs | 🟢▲ +0.23% | 3.27% |
local_socket_throughput
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| bidirectional/1024 | epoll | bytes_per_sec | 303.9 MB/s | 307.8 MB/s | 🟢▲ +1.63% | 1.58% |
| bidirectional/1024 | uring | bytes_per_sec | 304.5 MB/s | 301.8 MB/s | 🔴▼ -0.73% | 0.81% |
| bidirectional/1048576 | epoll | bytes_per_sec | 3.20 GB/s | 3.27 GB/s | 🟢▲ +1.22% | 2.88% |
| bidirectional/1048576 | uring | bytes_per_sec | 3.30 GB/s | 3.34 GB/s | 🟢▲ +0.40% | 1.54% |
| bidirectional/16384 | epoll | bytes_per_sec | 3.02 GB/s | 3.02 GB/s | 🔴▼ -1.72% | 3.01% |
| bidirectional/16384 | uring | bytes_per_sec | 2.43 GB/s | 2.41 GB/s | 🔴▼ -0.44% | 1.73% |
| bidirectional/262144 | epoll | bytes_per_sec | 3.20 GB/s | 3.23 GB/s | 🟢▲ +1.78% | 2.87% |
| bidirectional/262144 | uring | bytes_per_sec | 3.32 GB/s | 3.35 GB/s | 🔴▼ -0.16% | 1.66% |
| bidirectional/4096 | epoll | bytes_per_sec | 1.01 GB/s | 1.00 GB/s | 🟢▲ +0.12% | 0.99% |
| bidirectional/4096 | uring | bytes_per_sec | 987.0 MB/s | 990.4 MB/s | 🟢▲ +0.50% | 1.43% |
| bidirectional/65536 | epoll | bytes_per_sec | 3.00 GB/s | 2.99 GB/s | 🟢▲ +0.59% | 1.92% |
| bidirectional/65536 | uring | bytes_per_sec | 3.00 GB/s | 3.04 GB/s | 🟢▲ +0.57% | 2.75% |
| bidirectional_lockless/1024 | epoll | bytes_per_sec | 308.7 MB/s | 306.0 MB/s | 🔴▼ -0.74% | 1.29% |
| bidirectional_lockless/1024 | uring | bytes_per_sec | 304.6 MB/s | 303.4 MB/s | 🔴▼ -0.50% | 0.42% |
| bidirectional_lockless/1048576 | epoll | bytes_per_sec | 3.22 GB/s | 3.27 GB/s | 🟢▲ +0.95% | 2.54% |
| bidirectional_lockless/1048576 | uring | bytes_per_sec | 3.28 GB/s | 3.34 GB/s | 🟢▲ +2.28% | 1.56% |
| bidirectional_lockless/16384 | epoll | bytes_per_sec | 3.08 GB/s | 3.05 GB/s | 🔴▼ -0.11% | 3.14% |
| bidirectional_lockless/16384 | uring | bytes_per_sec | 2.44 GB/s | 2.42 GB/s | 🔴▼ -0.28% | 1.80% |
| bidirectional_lockless/262144 | epoll | bytes_per_sec | 3.20 GB/s | 3.23 GB/s | 🟢▲ +1.24% | 2.24% |
| bidirectional_lockless/262144 | uring | bytes_per_sec | 3.31 GB/s | 3.33 GB/s | 🔴▼ -0.58% | 1.70% |
| bidirectional_lockless/4096 | epoll | bytes_per_sec | 1.01 GB/s | 1.01 GB/s | 🔴▼ -0.48% | 0.74% |
| bidirectional_lockless/4096 | uring | bytes_per_sec | 992.9 MB/s | 992.6 MB/s | 🔴▼ -0.22% | 0.62% |
| bidirectional_lockless/65536 | epoll | bytes_per_sec | 3.00 GB/s | 3.00 GB/s | 🟢▲ +0.77% | 1.64% |
| bidirectional_lockless/65536 | uring | bytes_per_sec | 3.01 GB/s | 3.06 GB/s | 🟢▲ +0.96% | 2.82% |
| unidirectional/1024 | epoll | bytes_per_sec | 298.7 MB/s | 298.6 MB/s | 🟢▲ +0.24% | 1.16% |
| unidirectional/1024 | uring | bytes_per_sec | 302.3 MB/s | 300.4 MB/s | 🔴▼ -0.49% | 0.60% |
| unidirectional/1048576 | epoll | bytes_per_sec | 3.31 GB/s | 3.33 GB/s | 🔴▼ -0.62% | 2.58% |
| unidirectional/1048576 | uring | bytes_per_sec | 3.43 GB/s | 3.48 GB/s | 🟢▲ +1.92% | 1.99% |
| unidirectional/16384 | epoll | bytes_per_sec | 2.99 GB/s | 3.04 GB/s | 🔴▼ -1.31% | 6.48% |
| unidirectional/16384 | uring | bytes_per_sec | 2.66 GB/s | 2.66 GB/s | 🟢▲ +0.04% | 1.31% |
| unidirectional/262144 | epoll | bytes_per_sec | 3.29 GB/s | 3.29 GB/s | 🟢▲ +0.78% | 2.65% |
| unidirectional/262144 | uring | bytes_per_sec | 3.46 GB/s | 3.45 GB/s | 🔴▼ -1.33% | 1.88% |
| unidirectional/4096 | epoll | bytes_per_sec | 989.8 MB/s | 982.8 MB/s | 🔴▼ -0.66% | 1.25% |
| unidirectional/4096 | uring | bytes_per_sec | 993.2 MB/s | 991.6 MB/s | 🔴▼ -0.68% | 0.66% |
| unidirectional/65536 | epoll | bytes_per_sec | 3.20 GB/s | 3.24 GB/s | 🟢▲ +1.67% | 1.73% |
| unidirectional/65536 | uring | bytes_per_sec | 3.30 GB/s | 3.30 GB/s | 🟢▲ +0.27% | 2.58% |
| unidirectional_lockless/1024 | epoll | bytes_per_sec | 301.3 MB/s | 300.3 MB/s | 🟢▲ +0.06% | 1.07% |
| unidirectional_lockless/1024 | uring | bytes_per_sec | 302.0 MB/s | 304.3 MB/s | 🟢▲ +0.52% | 0.42% |
| unidirectional_lockless/1048576 | epoll | bytes_per_sec | 3.33 GB/s | 3.34 GB/s | 🔴▼ -0.68% | 2.84% |
| unidirectional_lockless/1048576 | uring | bytes_per_sec | 3.40 GB/s | 3.48 GB/s | 🟢▲ +1.78% | 2.86% |
| unidirectional_lockless/16384 | epoll | bytes_per_sec | 2.93 GB/s | 3.10 GB/s | 🟢▲ +8.72% | 6.49% |
| unidirectional_lockless/16384 | uring | bytes_per_sec | 2.66 GB/s | 2.69 GB/s | 🔴▼ -0.67% | 2.00% |
| unidirectional_lockless/262144 | epoll | bytes_per_sec | 3.30 GB/s | 3.32 GB/s | 🔴▼ -0.28% | 3.19% |
| unidirectional_lockless/262144 | uring | bytes_per_sec | 3.46 GB/s | 3.46 GB/s | 🔴▼ -0.87% | 1.95% |
| unidirectional_lockless/4096 | epoll | bytes_per_sec | 996.9 MB/s | 987.3 MB/s | 🔴▼ -1.10% | 0.84% |
| unidirectional_lockless/4096 | uring | bytes_per_sec | 989.5 MB/s | 994.2 MB/s | 🟢▲ +0.82% | 1.03% |
| unidirectional_lockless/65536 | epoll | bytes_per_sec | 3.26 GB/s | 3.25 GB/s | 🔴▼ -0.76% | 1.15% |
| unidirectional_lockless/65536 | uring | bytes_per_sec | 3.30 GB/s | 3.32 GB/s | 🔴▼ -0.55% | 1.45% |
socket_latency
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | epoll | latency_mean_ns | 14.87 µs | 14.74 µs | 🟢▲ +0.53% | 0.92% |
| concurrent/1 | uring | latency_mean_ns | 14.59 µs | 14.56 µs | 🟢▲ +0.17% | 0.18% |
| concurrent/16 | epoll | latency_mean_ns | 233.15 µs | 233.22 µs | 🟢▲ +0.31% | 0.68% |
| concurrent/16 | uring | latency_mean_ns | 236.18 µs | 234.64 µs | 🟢▲ +0.22% | 1.10% |
| concurrent/4 | epoll | latency_mean_ns | 58.49 µs | 58.28 µs | 🟢▲ +0.43% | 0.14% |
| concurrent/4 | uring | latency_mean_ns | 58.56 µs | 58.25 µs | 🟢▲ +0.06% | 1.13% |
| concurrent_lockless/1 | epoll | latency_mean_ns | 14.70 µs | 14.68 µs | 🟢▲ +0.40% | 1.11% |
| concurrent_lockless/1 | uring | latency_mean_ns | 14.55 µs | 14.47 µs | 🟢▲ +0.26% | 1.09% |
| concurrent_lockless/16 | epoll | latency_mean_ns | 230.17 µs | 230.75 µs | 🟢▲ +0.28% | 1.35% |
| concurrent_lockless/16 | uring | latency_mean_ns | 233.87 µs | 234.61 µs | 🟢▲ +0.13% | 1.14% |
| concurrent_lockless/4 | epoll | latency_mean_ns | 57.53 µs | 57.86 µs | 🟢▲ +0.39% | 1.43% |
| concurrent_lockless/4 | uring | latency_mean_ns | 58.30 µs | 58.18 µs | 🟢▲ +0.23% | 1.17% |
| pingpong/1 | epoll | latency_mean_ns | 14.61 µs | 14.61 µs | 🟢▲ +0.17% | 1.43% |
| pingpong/1 | uring | latency_mean_ns | 14.31 µs | 14.43 µs | 🔴▼ -0.43% | 1.57% |
| pingpong/1024 | epoll | latency_mean_ns | 15.03 µs | 14.91 µs | 🟢▲ +0.98% | 1.49% |
| pingpong/1024 | uring | latency_mean_ns | 14.68 µs | 14.87 µs | 🔴▼ -0.15% | 1.55% |
| pingpong/64 | epoll | latency_mean_ns | 14.71 µs | 14.67 µs | 🟢▲ +0.49% | 1.36% |
| pingpong/64 | uring | latency_mean_ns | 14.43 µs | 14.56 µs | 🔴▼ -0.32% | 1.66% |
| pingpong_lockless/1 | epoll | latency_mean_ns | 14.62 µs | 14.46 µs | 🟢▲ +1.08% | 1.47% |
| pingpong_lockless/1 | uring | latency_mean_ns | 14.38 µs | 14.48 µs | 🔴▼ -0.15% | 1.40% |
| pingpong_lockless/1024 | epoll | latency_mean_ns | 15.00 µs | 14.90 µs | 🟢▲ +0.52% | 1.12% |
| pingpong_lockless/1024 | uring | latency_mean_ns | 14.80 µs | 14.84 µs | 🔴▼ -0.01% | 0.42% |
| pingpong_lockless/64 | epoll | latency_mean_ns | 14.69 µs | 14.59 µs | 🟢▲ +1.02% | 1.09% |
| pingpong_lockless/64 | uring | latency_mean_ns | 14.50 µs | 14.57 µs | 🔴▼ -0.37% | 0.97% |
socket_throughput
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| bidirectional/1024 | epoll | bytes_per_sec | 133.4 MB/s | 133.9 MB/s | 🟢▲ +0.70% | 1.03% |
| bidirectional/1024 | uring | bytes_per_sec | 140.8 MB/s | 140.1 MB/s | 🔴▼ -0.14% | 1.03% |
| bidirectional/1048576 | epoll | bytes_per_sec | 3.25 GB/s | 3.26 GB/s | 🔴▼ -0.90% | 2.92% |
| bidirectional/1048576 | uring | bytes_per_sec | 3.28 GB/s | 3.28 GB/s | 🟢▲ +0.13% | 1.36% |
| bidirectional/16384 | epoll | bytes_per_sec | 1.62 GB/s | 1.64 GB/s | 🟢▲ +1.27% | 1.13% |
| bidirectional/16384 | uring | bytes_per_sec | 1.55 GB/s | 1.53 GB/s | 🔴▼ -1.71% | 1.14% |
| bidirectional/262144 | epoll | bytes_per_sec | 3.23 GB/s | 3.25 GB/s | 🟢▲ +0.58% | 0.81% |
| bidirectional/262144 | uring | bytes_per_sec | 3.22 GB/s | 3.22 GB/s | 🟢▲ +0.12% | 0.83% |
| bidirectional/4096 | epoll | bytes_per_sec | 503.0 MB/s | 505.2 MB/s | 🟢▲ +0.69% | 1.27% |
| bidirectional/4096 | uring | bytes_per_sec | 493.7 MB/s | 490.4 MB/s | 🔴▼ -0.70% | 1.20% |
| bidirectional/65536 | epoll | bytes_per_sec | 2.61 GB/s | 2.64 GB/s | 🟢▲ +1.86% | 4.15% |
| bidirectional/65536 | uring | bytes_per_sec | 2.83 GB/s | 2.80 GB/s | 🔴▼ -1.78% | 1.39% |
| bidirectional_lockless/1024 | epoll | bytes_per_sec | 134.6 MB/s | 134.7 MB/s | 🟢▲ +0.05% | 1.32% |
| bidirectional_lockless/1024 | uring | bytes_per_sec | 140.9 MB/s | 140.3 MB/s | 🔴▼ -0.09% | 1.06% |
| bidirectional_lockless/1048576 | epoll | bytes_per_sec | 3.29 GB/s | 3.29 GB/s | 🔴▼ -1.07% | 2.36% |
| bidirectional_lockless/1048576 | uring | bytes_per_sec | 3.24 GB/s | 3.29 GB/s | 🟢▲ +2.33% | 1.33% |
| bidirectional_lockless/16384 | epoll | bytes_per_sec | 1.63 GB/s | 1.62 GB/s | 🔴▼ -1.40% | 1.76% |
| bidirectional_lockless/16384 | uring | bytes_per_sec | 1.54 GB/s | 1.54 GB/s | 🟢▲ +0.06% | 0.69% |
| bidirectional_lockless/262144 | epoll | bytes_per_sec | 3.24 GB/s | 3.23 GB/s | 🔴▼ -0.60% | 0.65% |
| bidirectional_lockless/262144 | uring | bytes_per_sec | 3.18 GB/s | 3.20 GB/s | 🟢▲ +0.56% | 0.42% |
| bidirectional_lockless/4096 | epoll | bytes_per_sec | 504.1 MB/s | 506.8 MB/s | 🟢▲ +0.14% | 1.57% |
| bidirectional_lockless/4096 | uring | bytes_per_sec | 494.4 MB/s | 491.1 MB/s | 🔴▼ -0.31% | 1.03% |
| bidirectional_lockless/65536 | epoll | bytes_per_sec | 2.60 GB/s | 2.54 GB/s | 🔴▼ -1.88% | 2.19% |
| bidirectional_lockless/65536 | uring | bytes_per_sec | 2.78 GB/s | 2.79 GB/s | 🔴▼ -0.47% | 0.92% |
| multithread/2 | epoll | bytes_per_sec | 3.72 GB/s | 3.72 GB/s | 🔴▼ -0.48% | 1.08% |
| multithread/2 | uring | bytes_per_sec | 4.07 GB/s | 4.08 GB/s | 🟢▲ +0.20% | 1.27% |
| multithread/4 | epoll | bytes_per_sec | 5.90 GB/s | 5.91 GB/s | 🟢▲ +0.67% | 1.56% |
| multithread/4 | uring | bytes_per_sec | 6.49 GB/s | 6.51 GB/s | 🟢▲ +0.71% | 0.46% |
| multithread/8 | epoll | bytes_per_sec | 6.27 GB/s | 6.25 GB/s | 🔴▼ -0.60% | 0.87% |
| multithread/8 | uring | bytes_per_sec | 6.51 GB/s | 6.47 GB/s | 🔴▼ -0.81% | 0.65% |
| unidirectional/1024 | epoll | bytes_per_sec | 125.8 MB/s | 125.0 MB/s | 🔴▼ -0.03% | 1.36% |
| unidirectional/1024 | uring | bytes_per_sec | 139.9 MB/s | 138.6 MB/s | 🔴▼ -0.96% | 1.06% |
| unidirectional/1048576 | epoll | bytes_per_sec | 3.36 GB/s | 3.37 GB/s | 🟢▲ +0.20% | 0.56% |
| unidirectional/1048576 | uring | bytes_per_sec | 3.42 GB/s | 3.42 GB/s | 🔴▼ -0.56% | 0.96% |
| unidirectional/16384 | epoll | bytes_per_sec | 1.54 GB/s | 1.53 GB/s | 🔴▼ -1.59% | 1.74% |
| unidirectional/16384 | uring | bytes_per_sec | 1.55 GB/s | 1.59 GB/s | 🟢▲ +3.43% | 3.09% |
| unidirectional/262144 | epoll | bytes_per_sec | 3.32 GB/s | 3.36 GB/s | 🟢▲ +1.39% | 0.96% |
| unidirectional/262144 | uring | bytes_per_sec | 3.20 GB/s | 3.21 GB/s | 🔴▼ -0.10% | 0.92% |
| unidirectional/4096 | epoll | bytes_per_sec | 471.0 MB/s | 468.9 MB/s | 🔴▼ -0.35% | 1.35% |
| unidirectional/4096 | uring | bytes_per_sec | 496.4 MB/s | 492.6 MB/s | 🟢▲ +0.15% | 1.33% |
| unidirectional/65536 | epoll | bytes_per_sec | 2.79 GB/s | 2.73 GB/s | 🔴▼ -2.08% | 3.21% |
| unidirectional/65536 | uring | bytes_per_sec | 2.76 GB/s | 2.76 GB/s | 🔴▼ -0.44% | 2.02% |
| unidirectional_lockless/1024 | epoll | bytes_per_sec | 125.7 MB/s | 125.8 MB/s | 🟢▲ +0.32% | 0.35% |
| unidirectional_lockless/1024 | uring | bytes_per_sec | 139.6 MB/s | 138.8 MB/s | 🔴▼ -0.42% | 0.98% |
| unidirectional_lockless/1048576 | epoll | bytes_per_sec | 3.31 GB/s | 3.33 GB/s | 🟢▲ +0.22% | 1.17% |
| unidirectional_lockless/1048576 | uring | bytes_per_sec | 3.39 GB/s | 3.42 GB/s | 🟢▲ +1.15% | 0.94% |
| unidirectional_lockless/16384 | epoll | bytes_per_sec | 1.53 GB/s | 1.55 GB/s | 🟢▲ +1.57% | 2.30% |
| unidirectional_lockless/16384 | uring | bytes_per_sec | 1.57 GB/s | 1.62 GB/s | 🟢▲ +4.82% | 3.02% |
| unidirectional_lockless/262144 | epoll | bytes_per_sec | 3.33 GB/s | 3.35 GB/s | 🟢▲ +0.37% | 1.16% |
| unidirectional_lockless/262144 | uring | bytes_per_sec | 3.24 GB/s | 3.26 GB/s | 🟢▲ +1.29% | 0.63% |
| unidirectional_lockless/4096 | epoll | bytes_per_sec | 470.2 MB/s | 471.7 MB/s | 🟢▲ +0.58% | 0.72% |
| unidirectional_lockless/4096 | uring | bytes_per_sec | 486.7 MB/s | 488.6 MB/s | 🟢▲ +0.08% | 0.82% |
| unidirectional_lockless/65536 | epoll | bytes_per_sec | 2.71 GB/s | 2.80 GB/s | 🟢▲ +1.90% | 3.85% |
| unidirectional_lockless/65536 | uring | bytes_per_sec | 2.71 GB/s | 2.73 GB/s | 🟢▲ +0.33% | 5.60% |
windows — full results (77 benchmarks, 5 iterations, 1.5s each)
accept_churn
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| burst/10 | iocp | ops_per_sec | 1.57K ops/s | 1.57K ops/s | 🔴▼ -0.23% | 0.48% |
| burst/100 | iocp | ops_per_sec | 155.8 ops/s | 156.2 ops/s | 🟢▲ +0.34% | 1.25% |
| burst_lockless/10 | iocp | ops_per_sec | 1.57K ops/s | 1.57K ops/s | 🔴▼ -0.24% | 0.34% |
| burst_lockless/100 | iocp | ops_per_sec | 158.6 ops/s | 158.9 ops/s | 🔴▼ -0.38% | 0.97% |
| concurrent/1 | iocp | ops_per_sec | 12.55K ops/s | 12.52K ops/s | 🔴▼ -0.17% | 0.26% |
| concurrent/16 | iocp | ops_per_sec | 13.53K ops/s | 13.45K ops/s | 🔴▼ -0.55% | 0.39% |
| concurrent/4 | iocp | ops_per_sec | 13.20K ops/s | 13.15K ops/s | 🔴▼ -0.42% | 0.29% |
| sequential | iocp | ops_per_sec | 12.47K ops/s | 12.48K ops/s | 🟢▲ +0.12% | 0.46% |
| sequential_lockless | iocp | ops_per_sec | 12.54K ops/s | 12.50K ops/s | 🔴▼ -0.34% | 0.48% |
fan_out
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent_parents/1 | iocp | ops_per_sec | 7.29K ops/s | 7.29K ops/s | 🟢▲ +0.14% | 0.30% |
| concurrent_parents/16 | iocp | ops_per_sec | 6.21K ops/s | 6.21K ops/s | 🟢▲ +0.44% | 2.10% |
| concurrent_parents/4 | iocp | ops_per_sec | 6.85K ops/s | 6.86K ops/s | 🟢▲ +0.10% | 0.72% |
| concurrent_parents_lockless/1 | iocp | ops_per_sec | 7.28K ops/s | 7.30K ops/s | 🟢▲ +0.27% | 0.22% |
| concurrent_parents_lockless/16 | iocp | ops_per_sec | 6.33K ops/s | 6.33K ops/s | 🔴▼ -0.50% | 1.17% |
| concurrent_parents_lockless/4 | iocp | ops_per_sec | 6.89K ops/s | 6.90K ops/s | 🟢▲ +0.16% | 0.64% |
| fork_join/1 | iocp | ops_per_sec | 111.9K ops/s | 112.0K ops/s | 🟢▲ +0.06% | 0.38% |
| fork_join/16 | iocp | ops_per_sec | 7.28K ops/s | 7.28K ops/s | 🟢▲ +0.11% | 0.29% |
| fork_join/4 | iocp | ops_per_sec | 28.97K ops/s | 28.99K ops/s | 🟢▲ +0.05% | 0.21% |
| fork_join/64 | iocp | ops_per_sec | 1.72K ops/s | 1.72K ops/s | 🔴▼ -0.03% | 1.33% |
| fork_join_lockless/1 | iocp | ops_per_sec | 111.6K ops/s | 111.8K ops/s | 🟢▲ +0.36% | 0.55% |
| fork_join_lockless/16 | iocp | ops_per_sec | 7.30K ops/s | 7.31K ops/s | 🟢▲ +0.12% | 0.20% |
| fork_join_lockless/4 | iocp | ops_per_sec | 29.02K ops/s | 29.01K ops/s | 🔴▼ -0.08% | 0.19% |
| fork_join_lockless/64 | iocp | ops_per_sec | 1.71K ops/s | 1.72K ops/s | 🟢▲ +0.31% | 2.01% |
| nested/16 | iocp | ops_per_sec | 1.67K ops/s | 1.68K ops/s | 🔴▼ -0.11% | 1.39% |
| nested/4 | iocp | ops_per_sec | 7.10K ops/s | 7.10K ops/s | 🔴▼ -0.11% | 0.30% |
| nested_lockless/16 | iocp | ops_per_sec | 1.67K ops/s | 1.68K ops/s | 🟢▲ +0.17% | 0.79% |
| nested_lockless/4 | iocp | ops_per_sec | 7.11K ops/s | 7.10K ops/s | 🟢▲ +0.01% | 0.28% |
http_server
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | iocp | ops_per_sec | 110.5K ops/s | 110.9K ops/s | 🟢▲ +0.11% | 0.46% |
| concurrent/16 | iocp | ops_per_sec | 107.6K ops/s | 107.6K ops/s | 🟢▲ +0.10% | 0.31% |
| concurrent/32 | iocp | ops_per_sec | 106.8K ops/s | 107.1K ops/s | 🟢▲ +0.28% | 0.54% |
| concurrent/4 | iocp | ops_per_sec | 108.4K ops/s | 108.2K ops/s | 🔴▼ -0.06% | 0.51% |
| multithread/1 | iocp | ops_per_sec | 107.0K ops/s | 107.0K ops/s | 🟢▲ +0.13% | 0.40% |
| multithread/16 | iocp | ops_per_sec | 266.3K ops/s | 266.4K ops/s | 🟢▲ +0.07% | 0.63% |
| multithread/2 | iocp | ops_per_sec | 180.8K ops/s | 180.0K ops/s | 🔴▼ -0.67% | 0.82% |
| multithread/4 | iocp | ops_per_sec | 225.7K ops/s | 226.2K ops/s | 🟢▲ +0.31% | 0.42% |
| multithread/8 | iocp | ops_per_sec | 266.4K ops/s | 266.4K ops/s | 🔴▼ -0.02% | 0.54% |
| single_conn | iocp | ops_per_sec | 110.5K ops/s | 110.6K ops/s | 🟢▲ +0.37% | 0.43% |
| single_conn_lockless | iocp | ops_per_sec | 110.8K ops/s | 110.8K ops/s | 🔴▼ -0.08% | 0.46% |
socket_latency
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | iocp | latency_mean_ns | 7.71 µs | 7.68 µs | 🟢▲ +0.34% | 0.39% |
| concurrent/16 | iocp | latency_mean_ns | 130.80 µs | 131.05 µs | 🟢▲ +0.19% | 4.32% |
| concurrent/4 | iocp | latency_mean_ns | 30.75 µs | 30.90 µs | 🔴▼ -0.34% | 0.29% |
| concurrent_lockless/1 | iocp | latency_mean_ns | 7.69 µs | 7.70 µs | 🔴▼ -0.11% | 0.25% |
| concurrent_lockless/16 | iocp | latency_mean_ns | 122.93 µs | 122.87 µs | 🔴▼ -0.17% | 0.58% |
| concurrent_lockless/4 | iocp | latency_mean_ns | 30.76 µs | 30.86 µs | 🟢▲ +0.24% | 0.71% |
| pingpong/1 | iocp | latency_mean_ns | 7.67 µs | 7.67 µs | 🟢▲ +0.18% | 0.39% |
| pingpong/1024 | iocp | latency_mean_ns | 7.79 µs | 7.79 µs | 🟢▲ +0.16% | 0.35% |
| pingpong/64 | iocp | latency_mean_ns | 7.68 µs | 7.69 µs | 🟢▲ +0.17% | 0.49% |
| pingpong_lockless/1 | iocp | latency_mean_ns | 7.64 µs | 7.67 µs | 🔴▼ -0.33% | 0.48% |
| pingpong_lockless/1024 | iocp | latency_mean_ns | 7.80 µs | 7.79 µs | 🟢▲ +0.22% | 0.32% |
| pingpong_lockless/64 | iocp | latency_mean_ns | 7.69 µs | 7.68 µs | 🔴▼ -0.15% | 0.32% |
socket_throughput
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| bidirectional/1024 | iocp | bytes_per_sec | 279.4 MB/s | 279.3 MB/s | 🟢▲ +0.07% | 0.46% |
| bidirectional/1048576 | iocp | bytes_per_sec | 5.73 GB/s | 4.78 GB/s | 🔴▼ -17.34% | 4.45% |
| bidirectional/16384 | iocp | bytes_per_sec | 3.72 GB/s | 3.68 GB/s | 🔴▼ -0.17% | 2.91% |
| bidirectional/262144 | iocp | bytes_per_sec | 9.51 GB/s | 9.53 GB/s | 🔴▼ -0.13% | 2.62% |
| bidirectional/4096 | iocp | bytes_per_sec | 1.07 GB/s | 1.07 GB/s | 🟢▲ +0.16% | 1.30% |
| bidirectional/65536 | iocp | bytes_per_sec | 8.98 GB/s | 8.93 GB/s | 🔴▼ -0.49% | 3.80% |
| bidirectional_lockless/1024 | iocp | bytes_per_sec | 278.7 MB/s | 279.1 MB/s | 🟢▲ +0.03% | 0.36% |
| bidirectional_lockless/1048576 | iocp | bytes_per_sec | 5.92 GB/s | 5.06 GB/s | 🔴▼ -19.60% | 8.45% |
| bidirectional_lockless/16384 | iocp | bytes_per_sec | 3.71 GB/s | 3.65 GB/s | 🔴▼ -1.01% | 2.79% |
| bidirectional_lockless/262144 | iocp | bytes_per_sec | 9.73 GB/s | 9.63 GB/s | 🔴▼ -0.16% | 1.22% |
| bidirectional_lockless/4096 | iocp | bytes_per_sec | 1.07 GB/s | 1.07 GB/s | 🔴▼ -0.40% | 0.78% |
| bidirectional_lockless/65536 | iocp | bytes_per_sec | 9.02 GB/s | 8.91 GB/s | 🔴▼ -1.05% | 1.19% |
| multithread/2 | iocp | bytes_per_sec | 12.73 GB/s | 12.73 GB/s | 🟢▲ +0.44% | 0.85% |
| multithread/4 | iocp | bytes_per_sec | 17.04 GB/s | 17.10 GB/s | 🟢▲ +0.51% | 0.89% |
| multithread/8 | iocp | bytes_per_sec | 18.38 GB/s | 18.43 GB/s | 🟢▲ +0.26% | 0.91% |
| unidirectional/1024 | iocp | bytes_per_sec | 282.6 MB/s | 282.9 MB/s | 🟢▲ +0.25% | 0.28% |
| unidirectional/1048576 | iocp | bytes_per_sec | 4.22 GB/s | 4.40 GB/s | 🟢▲ +3.22% | 5.88% |
| unidirectional/16384 | iocp | bytes_per_sec | 3.76 GB/s | 3.74 GB/s | 🔴▼ -0.01% | 2.15% |
| unidirectional/262144 | iocp | bytes_per_sec | 8.23 GB/s | 8.92 GB/s | 🟢▲ +5.49% | 11.47% |
| unidirectional/4096 | iocp | bytes_per_sec | 1.08 GB/s | 1.08 GB/s | 🟢▲ +0.13% | 0.43% |
| unidirectional/65536 | iocp | bytes_per_sec | 8.88 GB/s | 9.15 GB/s | 🔴▼ -0.54% | 11.41% |
| unidirectional_lockless/1024 | iocp | bytes_per_sec | 283.6 MB/s | 284.1 MB/s | 🟢▲ +0.20% | 0.45% |
| unidirectional_lockless/1048576 | iocp | bytes_per_sec | 5.07 GB/s | 4.63 GB/s | 🔴▼ -9.02% | 3.56% |
| unidirectional_lockless/16384 | iocp | bytes_per_sec | 3.75 GB/s | 3.78 GB/s | 🔴▼ -0.01% | 1.73% |
| unidirectional_lockless/262144 | iocp | bytes_per_sec | 9.79 GB/s | 9.77 GB/s | 🔴▼ -0.66% | 1.08% |
| unidirectional_lockless/4096 | iocp | bytes_per_sec | 1.09 GB/s | 1.09 GB/s | 🟢▲ +0.30% | 0.88% |
| unidirectional_lockless/65536 | iocp | bytes_per_sec | 9.38 GB/s | 9.40 GB/s | 🟢▲ +0.20% | 0.40% |
macos — full results (113 benchmarks, 5 iterations, 1.5s each)
accept_churn
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| burst/10 | kqueue | ops_per_sec | 4.60K ops/s | 4.58K ops/s | 🔴▼ -0.85% | 0.69% |
| burst/100 | kqueue | ops_per_sec | 463.5 ops/s | 465.7 ops/s | 🟢▲ +0.27% | 0.53% |
| burst_lockless/10 | kqueue | ops_per_sec | 4.65K ops/s | 4.61K ops/s | 🔴▼ -0.98% | 0.73% |
| burst_lockless/100 | kqueue | ops_per_sec | 468.6 ops/s | 469.3 ops/s | 🔴▼ -0.15% | 0.82% |
| concurrent/1 | kqueue | ops_per_sec | 20.66K ops/s | 20.67K ops/s | 🔴▼ -0.15% | 0.96% |
| concurrent/16 | kqueue | ops_per_sec | 37.73K ops/s | 38.10K ops/s | 🟢▲ +0.60% | 0.98% |
| concurrent/4 | kqueue | ops_per_sec | 29.52K ops/s | 29.44K ops/s | 🔴▼ -0.25% | 0.49% |
| sequential | kqueue | ops_per_sec | 20.90K ops/s | 20.83K ops/s | 🔴▼ -0.49% | 0.65% |
| sequential_lockless | kqueue | ops_per_sec | 21.03K ops/s | 21.03K ops/s | 🔴▼ -0.94% | 1.74% |
fan_out
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent_parents/1 | kqueue | ops_per_sec | 8.03K ops/s | 8.07K ops/s | 🟢▲ +0.11% | 0.97% |
| concurrent_parents/16 | kqueue | ops_per_sec | 8.08K ops/s | 6.67K ops/s | 🔴▼ -19.42% | 16.86% |
| concurrent_parents/4 | kqueue | ops_per_sec | 8.18K ops/s | 8.27K ops/s | 🟢▲ +0.37% | 1.65% |
| concurrent_parents_lockless/1 | kqueue | ops_per_sec | 8.09K ops/s | 8.22K ops/s | 🟢▲ +1.92% | 0.84% |
| concurrent_parents_lockless/16 | kqueue | ops_per_sec | 8.20K ops/s | 7.07K ops/s | 🔴▼ -1.91% | 19.62% |
| concurrent_parents_lockless/4 | kqueue | ops_per_sec | 8.24K ops/s | 8.38K ops/s | 🟢▲ +2.75% | 1.48% |
| fork_join/1 | kqueue | ops_per_sec | 48.91K ops/s | 48.87K ops/s | 🔴▼ -0.20% | 1.01% |
| fork_join/16 | kqueue | ops_per_sec | 8.01K ops/s | 8.08K ops/s | 🟢▲ +0.51% | 0.99% |
| fork_join/4 | kqueue | ops_per_sec | 23.58K ops/s | 23.57K ops/s | 🔴▼ -0.48% | 0.85% |
| fork_join/64 | kqueue | ops_per_sec | 2.04K ops/s | 2.07K ops/s | 🟢▲ +0.11% | 2.14% |
| fork_join_lockless/1 | kqueue | ops_per_sec | 50.26K ops/s | 50.24K ops/s | 🔴▼ -0.14% | 0.29% |
| fork_join_lockless/16 | kqueue | ops_per_sec | 8.07K ops/s | 8.17K ops/s | 🟢▲ +1.01% | 0.86% |
| fork_join_lockless/4 | kqueue | ops_per_sec | 23.71K ops/s | 23.67K ops/s | 🔴▼ -0.43% | 0.79% |
| fork_join_lockless/64 | kqueue | ops_per_sec | 2.05K ops/s | 2.09K ops/s | 🟢▲ +0.39% | 2.24% |
| nested/16 | kqueue | ops_per_sec | 2.02K ops/s | 2.04K ops/s | 🟢▲ +0.28% | 1.90% |
| nested/4 | kqueue | ops_per_sec | 7.94K ops/s | 7.99K ops/s | 🟢▲ +0.05% | 1.00% |
| nested_lockless/16 | kqueue | ops_per_sec | 2.03K ops/s | 2.06K ops/s | 🟢▲ +0.29% | 2.06% |
| nested_lockless/4 | kqueue | ops_per_sec | 8.00K ops/s | 8.07K ops/s | 🟢▲ +0.53% | 0.78% |
http_server
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | kqueue | ops_per_sec | 49.44K ops/s | 49.58K ops/s | 🟢▲ +0.54% | 0.48% |
| concurrent/16 | kqueue | ops_per_sec | 130.2K ops/s | 130.8K ops/s | 🟢▲ +0.50% | 0.28% |
| concurrent/32 | kqueue | ops_per_sec | 129.5K ops/s | 130.2K ops/s | 🟢▲ +0.79% | 1.10% |
| concurrent/4 | kqueue | ops_per_sec | 89.84K ops/s | 89.99K ops/s | 🟢▲ +0.32% | 0.97% |
| multithread/1 | kqueue | ops_per_sec | 129.1K ops/s | 130.0K ops/s | 🟢▲ +0.29% | 1.13% |
| multithread/16 | kqueue | ops_per_sec | 132.6K ops/s | 133.1K ops/s | 🟢▲ +0.21% | 0.86% |
| multithread/2 | kqueue | ops_per_sec | 184.8K ops/s | 184.7K ops/s | 🔴▼ -0.44% | 1.14% |
| multithread/4 | kqueue | ops_per_sec | 162.7K ops/s | 162.2K ops/s | 🟢▲ +0.65% | 0.83% |
| multithread/8 | kqueue | ops_per_sec | 137.9K ops/s | 137.5K ops/s | 🟢▲ +0.46% | 1.36% |
| single_conn | kqueue | ops_per_sec | 49.50K ops/s | 49.56K ops/s | 🔴▼ -0.11% | 0.48% |
| single_conn_lockless | kqueue | ops_per_sec | 49.86K ops/s | 49.94K ops/s | 🟢▲ +0.26% | 0.50% |
local_socket_latency
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | kqueue | latency_mean_ns | 1.85 µs | 1.84 µs | 🟢▲ +0.36% | 0.65% |
| concurrent/16 | kqueue | latency_mean_ns | 27.45 µs | 27.43 µs | 🟢▲ +0.02% | 0.30% |
| concurrent/4 | kqueue | latency_mean_ns | 6.90 µs | 6.88 µs | 🟢▲ +0.44% | 0.41% |
| concurrent_lockless/1 | kqueue | latency_mean_ns | 1.83 µs | 1.82 µs | 🟢▲ +0.18% | 0.52% |
| concurrent_lockless/16 | kqueue | latency_mean_ns | 27.28 µs | 27.24 µs | 🟢▲ +0.12% | 0.39% |
| concurrent_lockless/4 | kqueue | latency_mean_ns | 6.84 µs | 6.83 µs | 🟢▲ +0.16% | 0.27% |
| pingpong/1 | kqueue | latency_mean_ns | 1.84 µs | 1.84 µs | 🟢▲ +0.52% | 0.37% |
| pingpong/1024 | kqueue | latency_mean_ns | 1.94 µs | 1.93 µs | 🟢▲ +0.11% | 0.57% |
| pingpong/64 | kqueue | latency_mean_ns | 1.84 µs | 1.84 µs | 🟢▲ +0.39% | 0.53% |
| pingpong_lockless/1 | kqueue | latency_mean_ns | 1.82 µs | 1.82 µs | 🔴▼ -0.03% | 0.80% |
| pingpong_lockless/1024 | kqueue | latency_mean_ns | 1.92 µs | 1.91 µs | 🟢▲ +0.46% | 0.42% |
| pingpong_lockless/64 | kqueue | latency_mean_ns | 1.83 µs | 1.82 µs | 🟢▲ +0.47% | 0.47% |
local_socket_throughput
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| bidirectional/1024 | kqueue | bytes_per_sec | 1.30 GB/s | 1.30 GB/s | 🟢▲ +0.12% | 0.72% |
| bidirectional/1048576 | kqueue | bytes_per_sec | 3.87 GB/s | 3.88 GB/s | 🟢▲ +0.43% | 0.50% |
| bidirectional/16384 | kqueue | bytes_per_sec | 3.87 GB/s | 3.87 GB/s | 🔴▼ -0.08% | 0.53% |
| bidirectional/262144 | kqueue | bytes_per_sec | 3.89 GB/s | 3.88 GB/s | 🔴▼ -0.18% | 0.34% |
| bidirectional/4096 | kqueue | bytes_per_sec | 2.92 GB/s | 2.92 GB/s | 🟢▲ +0.11% | 0.46% |
| bidirectional/65536 | kqueue | bytes_per_sec | 3.88 GB/s | 3.87 GB/s | 🔴▼ -0.02% | 0.42% |
| bidirectional_lockless/1024 | kqueue | bytes_per_sec | 1.31 GB/s | 1.31 GB/s | 🟢▲ +0.09% | 0.60% |
| bidirectional_lockless/1048576 | kqueue | bytes_per_sec | 3.95 GB/s | 3.96 GB/s | 🟢▲ +0.46% | 0.76% |
| bidirectional_lockless/16384 | kqueue | bytes_per_sec | 3.95 GB/s | 3.95 GB/s | 🔴▼ -0.22% | 0.83% |
| bidirectional_lockless/262144 | kqueue | bytes_per_sec | 3.96 GB/s | 3.94 GB/s | 🔴▼ -0.32% | 0.51% |
| bidirectional_lockless/4096 | kqueue | bytes_per_sec | 2.95 GB/s | 2.96 GB/s | 🟢▲ +0.31% | 0.47% |
| bidirectional_lockless/65536 | kqueue | bytes_per_sec | 3.95 GB/s | 3.95 GB/s | 🟢▲ +0.12% | 0.49% |
| unidirectional/1024 | kqueue | bytes_per_sec | 1.27 GB/s | 1.28 GB/s | 🟢▲ +0.35% | 0.63% |
| unidirectional/1048576 | kqueue | bytes_per_sec | 3.52 GB/s | 3.54 GB/s | 🔴▼ -0.04% | 0.61% |
| unidirectional/16384 | kqueue | bytes_per_sec | 3.52 GB/s | 3.53 GB/s | 🔴▼ -0.05% | 0.53% |
| unidirectional/262144 | kqueue | bytes_per_sec | 3.52 GB/s | 3.53 GB/s | 🟢▲ +0.12% | 0.46% |
| unidirectional/4096 | kqueue | bytes_per_sec | 2.71 GB/s | 2.72 GB/s | 🟢▲ +0.29% | 0.63% |
| unidirectional/65536 | kqueue | bytes_per_sec | 3.52 GB/s | 3.54 GB/s | 🟢▲ +0.29% | 0.52% |
| unidirectional_lockless/1024 | kqueue | bytes_per_sec | 1.28 GB/s | 1.29 GB/s | 🟢▲ +0.17% | 0.64% |
| unidirectional_lockless/1048576 | kqueue | bytes_per_sec | 3.59 GB/s | 3.59 GB/s | ⚪ 0.00% | 0.43% |
| unidirectional_lockless/16384 | kqueue | bytes_per_sec | 3.60 GB/s | 3.59 GB/s | 🔴▼ -0.28% | 0.58% |
| unidirectional_lockless/262144 | kqueue | bytes_per_sec | 3.59 GB/s | 3.59 GB/s | 🟢▲ +0.21% | 0.60% |
| unidirectional_lockless/4096 | kqueue | bytes_per_sec | 2.76 GB/s | 2.77 GB/s | 🟢▲ +0.50% | 0.43% |
| unidirectional_lockless/65536 | kqueue | bytes_per_sec | 3.60 GB/s | 3.60 GB/s | 🔴▼ -0.11% | 0.47% |
socket_latency
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| concurrent/1 | kqueue | latency_mean_ns | 18.75 µs | 18.75 µs | 🟢▲ +0.04% | 0.18% |
| concurrent/16 | kqueue | latency_mean_ns | 120.10 µs | 120.03 µs | 🔴▼ -0.12% | 0.87% |
| concurrent/4 | kqueue | latency_mean_ns | 42.99 µs | 42.92 µs | 🔴▼ -0.65% | 0.93% |
| concurrent_lockless/1 | kqueue | latency_mean_ns | 18.71 µs | 18.70 µs | 🟢▲ +0.02% | 0.08% |
| concurrent_lockless/16 | kqueue | latency_mean_ns | 120.01 µs | 120.40 µs | 🟢▲ +0.27% | 1.24% |
| concurrent_lockless/4 | kqueue | latency_mean_ns | 42.54 µs | 42.40 µs | 🟢▲ +0.23% | 0.67% |
| pingpong/1 | kqueue | latency_mean_ns | 15.47 µs | 15.44 µs | 🟢▲ +0.12% | 0.72% |
| pingpong/1024 | kqueue | latency_mean_ns | 19.05 µs | 19.05 µs | 🔴▼ -0.01% | 0.20% |
| pingpong/64 | kqueue | latency_mean_ns | 18.74 µs | 18.75 µs | 🔴▼ -0.11% | 0.13% |
| pingpong_lockless/1 | kqueue | latency_mean_ns | 15.40 µs | 15.37 µs | 🔴▼ -0.05% | 0.57% |
| pingpong_lockless/1024 | kqueue | latency_mean_ns | 19.04 µs | 19.03 µs | 🟢▲ +0.12% | 0.16% |
| pingpong_lockless/64 | kqueue | latency_mean_ns | 18.70 µs | 18.72 µs | 🔴▼ -0.18% | 0.24% |
socket_throughput
| Benchmark | Backend | Metric | Base | Head | Δ | Noise |
|---|---|---|---|---|---|---|
| bidirectional/1024 | kqueue | bytes_per_sec | 473.6 MB/s | 472.5 MB/s | 🔴▼ -0.01% | 1.26% |
| bidirectional/1048576 | kqueue | bytes_per_sec | 7.80 GB/s | 7.56 GB/s | 🔴▼ -0.29% | 4.85% |
| bidirectional/16384 | kqueue | bytes_per_sec | 4.56 GB/s | 4.51 GB/s | 🔴▼ -0.62% | 0.89% |
| bidirectional/262144 | kqueue | bytes_per_sec | 8.77 GB/s | 8.58 GB/s | 🔴▼ -1.39% | 1.45% |
| bidirectional/4096 | kqueue | bytes_per_sec | 1.83 GB/s | 1.82 GB/s | 🔴▼ -0.60% | 0.50% |
| bidirectional/65536 | kqueue | bytes_per_sec | 7.67 GB/s | 7.60 GB/s | 🔴▼ -0.98% | 2.00% |
| bidirectional_lockless/1024 | kqueue | bytes_per_sec | 477.0 MB/s | 476.9 MB/s | 🔴▼ -0.06% | 0.91% |
| bidirectional_lockless/1048576 | kqueue | bytes_per_sec | 7.85 GB/s | 7.58 GB/s | 🔴▼ -0.29% | 4.98% |
| bidirectional_lockless/16384 | kqueue | bytes_per_sec | 4.58 GB/s | 4.57 GB/s | 🟢▲ +0.01% | 0.87% |
| bidirectional_lockless/262144 | kqueue | bytes_per_sec | 8.87 GB/s | 8.77 GB/s | 🔴▼ -2.21% | 2.53% |
| bidirectional_lockless/4096 | kqueue | bytes_per_sec | 1.83 GB/s | 1.83 GB/s | 🟢▲ +0.05% | 0.43% |
| bidirectional_lockless/65536 | kqueue | bytes_per_sec | 7.61 GB/s | 7.62 GB/s | 🔴▼ -0.14% | 1.25% |
| multithread/2 | kqueue | bytes_per_sec | 7.65 GB/s | 7.50 GB/s | 🔴▼ -3.01% | 3.22% |
| multithread/4 | kqueue | bytes_per_sec | 3.77 GB/s | 3.81 GB/s | 🟢▲ +1.94% | 2.73% |
| multithread/8 | kqueue | bytes_per_sec | 3.32 GB/s | 3.28 GB/s | 🟢▲ +2.33% | 8.41% |
| unidirectional/1024 | kqueue | bytes_per_sec | 460.6 MB/s | 457.6 MB/s | 🔴▼ -0.40% | 2.25% |
| unidirectional/1048576 | kqueue | bytes_per_sec | 9.05 GB/s | 8.77 GB/s | 🔴▼ -0.62% | 5.97% |
| unidirectional/16384 | kqueue | bytes_per_sec | 4.48 GB/s | 4.45 GB/s | 🟢▲ +0.93% | 3.07% |
| unidirectional/262144 | kqueue | bytes_per_sec | 9.10 GB/s | 9.06 GB/s | 🔴▼ -1.04% | 4.91% |
| unidirectional/4096 | kqueue | bytes_per_sec | 1.81 GB/s | 1.79 GB/s | 🔴▼ -1.12% | 2.03% |
| unidirectional/65536 | kqueue | bytes_per_sec | 7.44 GB/s | 7.40 GB/s | 🔴▼ -0.09% | 1.09% |
| unidirectional_lockless/1024 | kqueue | bytes_per_sec | 483.2 MB/s | 478.2 MB/s | 🔴▼ -0.45% | 2.34% |
| unidirectional_lockless/1048576 | kqueue | bytes_per_sec | 9.08 GB/s | 8.80 GB/s | 🔴▼ -0.72% | 5.43% |
| unidirectional_lockless/16384 | kqueue | bytes_per_sec | 4.45 GB/s | 4.51 GB/s | 🟢▲ +0.65% | 2.65% |
| unidirectional_lockless/262144 | kqueue | bytes_per_sec | 9.08 GB/s | 9.03 GB/s | 🔴▼ -0.98% | 4.24% |
| unidirectional_lockless/4096 | kqueue | bytes_per_sec | 1.81 GB/s | 1.81 GB/s | 🔴▼ -0.13% | 1.63% |
| unidirectional_lockless/65536 | kqueue | bytes_per_sec | 7.53 GB/s | 7.40 GB/s | 🔴▼ -1.34% | 3.08% |
Run & raw JSON artifacts · flag rule: |median Δ| > max(2%, 3×CV of the noisier side) · advisory only
a3036e8 to
48ba6c2
Compare
The Signals examples now shut down through a stop token instead of ioc.stop(). The signal coroutine no longer references a local of run_server, so a signal that arrives after run_server ends cannot write freed memory, and run() returns once the coroutines finish. The acceptor's accept loop owns its acceptor and stops on a stop token, so it cannot outlive the acceptor. D6 now says "after it may be stored", which covers reads before a lazy task's first co_await, and joins the Review tier and the doc PR checklist. The Hash Server tutorial says do_session stays suspended while the hash runs on the pool. Refs cppalliance#353
The I/O Context guide said dispatch resumes a completed operation's coroutine "by symmetric transfer". It does not: the event loop calls dispatch_coro() and then resume() on the result, a plain inline resume. Say it resumes the coroutine inline on that thread, with no queue or wakeup. The message of 4dca714 has the same wrong wording. Also: - UDP: say what a receiver is required to accept, and the UDP payload those sizes leave after the headers. - Hash Server: captures would also be safe for the run() lambda; parameters are the habit, not a requirement here. - Style guide D6: say "after the caller's scope may have ended" instead of the unclear "after it may be stored". - timer.hpp: replace the last "correct executor" phrase with which executor resumes the coroutine. - TCP closing: note the FIN_WAIT_1 to TIME_WAIT shortcut the figure leaves out. Refs cppalliance#353
The handshake, the teardown and the closing states on "Opening and Closing TCP Connections" were ASCII art. Draw them with Mermaid, the way Capy draws its diagrams: two sequence diagrams and a state diagram. The state diagram now shows the FIN_WAIT_1 to TIME_WAIT shortcut that the ASCII figure had to leave out. - Load @sntke/antora-mermaid-extension in the local playbook, with the same settings as boost.org's libs playbook, which already loads it. - Add partials/diagram-style.adoc, adapted from Capy's. It styles the diagrams in the palette of the benchmark charts in light and dark mode, and adds rules for state diagrams. - Port Capy's doc-lint exemption and self-test: a [mermaid] block is diagram source, so B2 and SHAPE skip it, but it never clears a [source,*] block. Refs cppalliance#353
49f7fd1 to
7201a94
Compare
The Boost review of Corosio asked for the documentation comments in "Some thoughts on Corosio" to be addressed. #353 lists the items from that message that #324 does not already track. This PR addresses six of the seven. The seventh, dark mode, is left out: the description-list color comes from boostlook, so the fix belongs there rather than in this repo's playbook.
Changes
run_asynctakes by value whatever it reads after it may be stored, which for a task includes reads before its firstco_await. It takes by reference only what outlivesrun(). The two rendered examples that broke the rule now follow it: the Signals server no longer references a local ofrun_server, and the acceptor's accept loop owns its acceptor and stops on a stop token. D6 is in the Review tier of the enforcement table and the doc PR checklist. The Dangling References section links to the Lifetime and Teardown page.CLOSINGfor a simultaneous close.io_objectgains an Executor Affinity paragraph, as style guide rule D4 asks. An operation resumes the awaiting coroutine through that coroutine's executor, not the executor of the context that owns the I/O object. The socket, acceptor and resolver docs now say this instead of "the correct executor".io_contextalso runs coroutines: the I/O Context guide explains that keeping both in one place lets a completion resume the awaiting coroutine inline, instead of paying for a queue and a cross-thread wakeup each time.compute_fnv1ais now a plain function.do_sessionwraps it in a coroutine lambda at the call site and passes the buffer as parameters rather than captures (option 2 from the discussion in docs: address the remaining mailing-list review feedback #353). The tutorial matches, and now saysdo_sessionstays suspended while the hash runs on the pool.Refs #353