Skip to content

docs: address the remaining mailing-list review feedback - #412

Merged
sgerbino merged 9 commits into
cppalliance:developfrom
TheLingeringWill:pr/docs-remaining-review-feedback
Nov 9, 2026
Merged

sgerbino merged 9 commits into
cppalliance:developfrom
TheLingeringWill:pr/docs-remaining-review-feedback

Conversation

@TheLingeringWill

@TheLingeringWill TheLingeringWill commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

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

  • UDP fragmentation: the UDP tutorial now warns that a receiver only has to reassemble 576 bytes for IPv4 and 1500 bytes for IPv6, and may silently drop a larger fragmented datagram. Oversized datagrams are a correctness hazard, not only a cost.
  • Coroutine arguments in examples: new style guide rule D6. A coroutine started with run_async takes by value whatever it reads after it may be stored, which for a task includes reads before its first co_await. It takes by reference only what outlives run(). The two rendered examples that broke the rule now follow it: the Signals server no longer references a local of run_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.
  • Closing a TCP connection: a figure shows the two closing paths, which branch on which side sends the first FIN. The state list gains CLOSING for a simultaneous close.
  • Executor affinity: io_object gains 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".
  • Why io_context also 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.
  • Hash Server: compute_fnv1a is now a plain function. do_session wraps 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 says do_session stays suspended while the hash runs on the pool.

Refs #353

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
@cppalliance-bot

cppalliance-bot commented Nov 5, 2026 •

Copy link
Copy Markdown

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

@cppalliance-bot

cppalliance-bot commented Nov 5, 2026 •

Copy link
Copy Markdown

GCOVR code coverage report https://412.corosio.prtest3.cppalliance.org/gcovr/index.html
LCOV code coverage report https://412.corosio.prtest3.cppalliance.org/genhtml/index.html
Coverage Diff Report https://412.corosio.prtest3.cppalliance.org/diff-report/index.html

Build time: 2026-11-09 17:39:55 UTC

@sgerbino sgerbino added the benchmark Triggers benchmark suite label Nov 5, 2026
@github-actions github-actions Bot removed the benchmark Triggers benchmark suite label Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown

Benchmark report

d3586300a7d7 (base) vs dd815fabcc0a (head)

  • ✅ linux — clean (epoll, uring)
  • ⚠️ windows — 1 flagged (iocp)
  • ✅ macos — clean (kqueue)

⚠️ Flagged

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

@TheLingeringWill
TheLingeringWill marked this pull request as ready for review November 5, 2026 20:50
@TheLingeringWill
TheLingeringWill force-pushed the pr/docs-remaining-review-feedback branch from a3036e8 to 48ba6c2 Compare November 6, 2026 23:57
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
@TheLingeringWill
TheLingeringWill force-pushed the pr/docs-remaining-review-feedback branch from 49f7fd1 to 7201a94 Compare November 9, 2026 17:23
@sgerbino
sgerbino merged commit 13bcf93 into cppalliance:develop Nov 9, 2026
43 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Beast2 Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants