Skip to content

perf: run handlers queued behind the reactor before polling again - #416

Draft
sgerbino wants to merge 1 commit into
developfrom
pr/recycling-free-list
Draft

sgerbino wants to merge 1 commit into
developfrom
pr/recycling-free-list

Conversation

@sgerbino

Copy link
Copy Markdown
Collaborator

When the reactor sentinel reached the front of the queue with handlers still behind it, the scheduler ran a non-blocking reactor poll. Those handlers were mostly posted by the pass that just ran, such as a coroutine an I/O completion woke, so the poll usually found nothing. On fan_out/fork_join/1 that was one empty epoll_wait(0) per lap.

The sentinel now moves behind the queued handlers once, then polls on its next turn regardless, so handlers that keep reposting still cannot starve I/O. poll() and poll_one() are unchanged.

testPostedWakeRunsBeforeNextPoll in the reactor fault suite counts the backend's wait calls to check that a posted wake runs before the next poll.

Pairs with cppalliance/capy pr/recycling-free-list, which lets the frame allocator cache a wide fan-out. CI resolves that capy branch by name. The benchmark A/B builds both sides against it, so the A/B measures only the scheduler change.

Local A/B on one pinned P-core, 5 interleaved runs of 2 s each, both changes vs develop:

Row develop this branch Δ
fork_join/1 188.6K 194.4K +3.1%
fork_join/64 3092 3182 +2.9%
nested/16 3004 3176 +5.7%
concurrent_parents/4 12.31K 12.73K +3.4%
concurrent_parents/16 10.97K 11.44K +4.3%
concurrent_parents_lockless/16 11.23K 11.62K +3.5%

io_context multithreaded/8 measured −0.9% locally, within noise. The CI run should settle it.

@cppalliance-bot

cppalliance-bot commented Nov 12, 2026 •

Copy link
Copy Markdown

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

Build time: 2026-11-13 06:22:12 UTC

@sgerbino
sgerbino force-pushed the pr/recycling-free-list branch from 7c6bd6d to 1e59c16 Compare November 12, 2026 15:07
@cppalliance-bot

cppalliance-bot commented Nov 12, 2026 •

Copy link
Copy Markdown

An automated preview of the documentation is available at https://416.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-12 19:25:00 UTC

@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

Benchmark report

13bcf933adf8 (base) vs 97fbd80fe670 (head)

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

⚠️ Flagged

Platform Backend Benchmark Metric Base Head Δ Noise
linux epoll local_socket_latency/concurrent_lockless/1 latency_mean_ns 7.00 µs 6.67 µs 🟢▲ +5.08% 1.04%
linux epoll local_socket_throughput/unidirectional/1024 bytes_per_sec 299.1 MB/s 308.5 MB/s 🟢▲ +3.37% 0.96%
linux epoll socket_latency/concurrent_lockless/1 latency_mean_ns 14.68 µs 14.39 µs 🟢▲ +2.05% 0.45%
linux epoll socket_latency/pingpong/1024 latency_mean_ns 15.04 µs 14.69 µs 🟢▲ +2.51% 0.83%
macos kqueue accept_churn/burst_lockless/10 ops_per_sec 4.62K ops/s 4.84K ops/s 🟢▲ +5.15% 0.71%
macos kqueue fan_out/fork_join/4 ops_per_sec 23.53K ops/s 24.11K ops/s 🟢▲ +2.55% 0.73%
macos kqueue fan_out/fork_join_lockless/1 ops_per_sec 50.35K ops/s 51.51K ops/s 🟢▲ +2.40% 0.35%
macos kqueue fan_out/fork_join_lockless/4 ops_per_sec 23.68K ops/s 24.26K ops/s 🟢▲ +2.50% 0.42%
macos kqueue local_socket_latency/concurrent/1 latency_mean_ns 1.84 µs 1.71 µs 🟢▲ +6.65% 0.68%
macos kqueue local_socket_latency/concurrent/4 latency_mean_ns 6.86 µs 6.69 µs 🟢▲ +2.48% 0.54%
macos kqueue local_socket_latency/concurrent_lockless/1 latency_mean_ns 1.81 µs 1.70 µs 🟢▲ +6.33% 0.69%
macos kqueue local_socket_latency/pingpong/1 latency_mean_ns 1.83 µs 1.71 µs 🟢▲ +6.42% 0.65%
macos kqueue local_socket_latency/pingpong/1024 latency_mean_ns 1.93 µs 1.81 µs 🟢▲ +6.18% 0.69%
macos kqueue local_socket_latency/pingpong/64 latency_mean_ns 1.83 µs 1.72 µs 🟢▲ +5.95% 0.51%
macos kqueue local_socket_latency/pingpong_lockless/1 latency_mean_ns 1.81 µs 1.70 µs 🟢▲ +6.02% 0.82%
macos kqueue local_socket_latency/pingpong_lockless/1024 latency_mean_ns 1.92 µs 1.80 µs 🟢▲ +5.87% 0.55%
macos kqueue local_socket_latency/pingpong_lockless/64 latency_mean_ns 1.82 µs 1.70 µs 🟢▲ +6.16% 0.68%
macos kqueue local_socket_throughput/unidirectional/1024 bytes_per_sec 1.27 GB/s 1.31 GB/s 🟢▲ +3.12% 0.39%
macos kqueue local_socket_throughput/unidirectional_lockless/1024 bytes_per_sec 1.28 GB/s 1.32 GB/s 🟢▲ +3.42% 0.61%
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.00K ops/s 2.01K ops/s 🟢▲ +0.18% 0.31%
burst/10 uring ops_per_sec 2.39K ops/s 2.40K ops/s 🟢▲ +0.14% 0.22%
burst/100 epoll ops_per_sec 203.4 ops/s 203.8 ops/s 🟢▲ +0.22% 0.26%
burst/100 uring ops_per_sec 246.7 ops/s 247.6 ops/s 🟢▲ +0.09% 0.62%
burst_lockless/10 epoll ops_per_sec 2.03K ops/s 2.03K ops/s 🟢▲ +0.20% 0.36%
burst_lockless/10 uring ops_per_sec 2.41K ops/s 2.41K ops/s 🔴▼ -0.10% 0.19%
burst_lockless/100 epoll ops_per_sec 206.0 ops/s 206.1 ops/s 🟢▲ +0.02% 0.32%
burst_lockless/100 uring ops_per_sec 247.8 ops/s 248.0 ops/s 🔴▼ -0.02% 0.42%
concurrent/1 epoll ops_per_sec 15.93K ops/s 15.99K ops/s 🟢▲ +0.52% 0.94%
concurrent/1 uring ops_per_sec 17.14K ops/s 17.14K ops/s ⚪ 0.00% 0.45%
concurrent/16 epoll ops_per_sec 15.91K ops/s 16.02K ops/s 🟢▲ +0.58% 0.62%
concurrent/16 uring ops_per_sec 18.76K ops/s 18.74K ops/s 🔴▼ -0.19% 0.27%
concurrent/4 epoll ops_per_sec 15.94K ops/s 15.99K ops/s 🔴▼ -0.02% 0.57%
concurrent/4 uring ops_per_sec 17.74K ops/s 17.74K ops/s 🟢▲ +0.14% 0.33%
sequential epoll ops_per_sec 15.89K ops/s 15.98K ops/s 🟢▲ +0.55% 0.90%
sequential uring ops_per_sec 17.20K ops/s 17.16K ops/s 🟢▲ +0.33% 1.34%
sequential_lockless epoll ops_per_sec 16.12K ops/s 16.17K ops/s 🟢▲ +0.66% 0.96%
sequential_lockless uring ops_per_sec 17.29K ops/s 17.30K ops/s 🟢▲ +0.12% 0.50%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 epoll ops_per_sec 3.84K ops/s 3.87K ops/s 🟢▲ +0.14% 1.27%
concurrent_parents/1 uring ops_per_sec 4.01K ops/s 3.98K ops/s 🔴▼ -0.33% 0.96%
concurrent_parents/16 epoll ops_per_sec 3.78K ops/s 3.80K ops/s 🟢▲ +0.15% 1.05%
concurrent_parents/16 uring ops_per_sec 3.94K ops/s 3.92K ops/s 🔴▼ -0.22% 1.02%
concurrent_parents/4 epoll ops_per_sec 3.78K ops/s 3.80K ops/s 🔴▼ -0.02% 1.11%
concurrent_parents/4 uring ops_per_sec 3.98K ops/s 3.95K ops/s 🔴▼ -0.10% 1.00%
concurrent_parents_lockless/1 epoll ops_per_sec 3.91K ops/s 3.91K ops/s 🔴▼ -0.10% 1.10%
concurrent_parents_lockless/1 uring ops_per_sec 4.05K ops/s 4.04K ops/s 🔴▼ -0.02% 0.91%
concurrent_parents_lockless/16 epoll ops_per_sec 3.82K ops/s 3.81K ops/s 🔴▼ -0.15% 0.96%
concurrent_parents_lockless/16 uring ops_per_sec 3.99K ops/s 3.98K ops/s 🔴▼ -0.19% 1.08%
concurrent_parents_lockless/4 epoll ops_per_sec 3.83K ops/s 3.83K ops/s 🔴▼ -0.19% 1.13%
concurrent_parents_lockless/4 uring ops_per_sec 4.02K ops/s 4.02K ops/s 🟢▲ +0.12% 1.04%
fork_join/1 epoll ops_per_sec 56.38K ops/s 57.34K ops/s 🟢▲ +1.76% 0.29%
fork_join/1 uring ops_per_sec 54.33K ops/s 54.31K ops/s 🟢▲ +0.11% 0.31%
fork_join/16 epoll ops_per_sec 3.86K ops/s 3.85K ops/s 🟢▲ +0.11% 1.14%
fork_join/16 uring ops_per_sec 3.99K ops/s 4.00K ops/s 🟢▲ +0.09% 0.28%
fork_join/4 epoll ops_per_sec 15.22K ops/s 15.24K ops/s 🟢▲ +0.25% 0.70%
fork_join/4 uring ops_per_sec 14.98K ops/s 14.92K ops/s 🔴▼ -0.41% 0.45%
fork_join/64 epoll ops_per_sec 949.6 ops/s 945.3 ops/s 🔴▼ -0.23% 0.91%
fork_join/64 uring ops_per_sec 993.1 ops/s 990.3 ops/s 🔴▼ -0.34% 0.22%
fork_join_lockless/1 epoll ops_per_sec 57.41K ops/s 58.30K ops/s 🟢▲ +1.97% 1.08%
fork_join_lockless/1 uring ops_per_sec 55.91K ops/s 55.93K ops/s 🟢▲ +0.24% 0.63%
fork_join_lockless/16 epoll ops_per_sec 3.91K ops/s 3.89K ops/s 🔴▼ -0.35% 0.99%
fork_join_lockless/16 uring ops_per_sec 4.07K ops/s 4.04K ops/s 🔴▼ -0.47% 0.89%
fork_join_lockless/4 epoll ops_per_sec 15.44K ops/s 15.42K ops/s 🟢▲ +0.34% 1.25%
fork_join_lockless/4 uring ops_per_sec 15.30K ops/s 15.24K ops/s 🔴▼ -0.06% 0.85%
fork_join_lockless/64 epoll ops_per_sec 959.1 ops/s 953.4 ops/s 🔴▼ -0.35% 0.97%
fork_join_lockless/64 uring ops_per_sec 1.01K ops/s 1.00K ops/s 🔴▼ -0.21% 0.94%
nested/16 epoll ops_per_sec 941.9 ops/s 940.8 ops/s 🔴▼ -0.09% 0.25%
nested/16 uring ops_per_sec 991.7 ops/s 985.9 ops/s 🔴▼ -0.05% 0.94%
nested/4 epoll ops_per_sec 3.83K ops/s 3.82K ops/s 🔴▼ -0.21% 0.37%
nested/4 uring ops_per_sec 4.00K ops/s 3.97K ops/s 🔴▼ -0.52% 0.98%
nested_lockless/16 epoll ops_per_sec 951.9 ops/s 955.5 ops/s 🟢▲ +0.02% 1.18%
nested_lockless/16 uring ops_per_sec 1.00K ops/s 997.5 ops/s 🟢▲ +0.15% 0.94%
nested_lockless/4 epoll ops_per_sec 3.87K ops/s 3.87K ops/s 🟢▲ +0.03% 0.32%
nested_lockless/4 uring ops_per_sec 4.04K ops/s 4.03K ops/s 🟢▲ +0.27% 1.16%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll ops_per_sec 56.93K ops/s 56.61K ops/s 🔴▼ -0.41% 1.14%
concurrent/1 uring ops_per_sec 53.49K ops/s 52.99K ops/s 🔴▼ -0.80% 0.90%
concurrent/16 epoll ops_per_sec 60.20K ops/s 59.84K ops/s 🔴▼ -0.32% 0.94%
concurrent/16 uring ops_per_sec 63.66K ops/s 63.35K ops/s 🔴▼ -0.06% 1.09%
concurrent/32 epoll ops_per_sec 59.64K ops/s 59.38K ops/s 🔴▼ -0.14% 1.02%
concurrent/32 uring ops_per_sec 63.83K ops/s 63.48K ops/s 🔴▼ -0.54% 0.93%
concurrent/4 epoll ops_per_sec 59.55K ops/s 59.05K ops/s 🔴▼ -0.13% 1.31%
concurrent/4 uring ops_per_sec 61.31K ops/s 60.85K ops/s 🔴▼ -0.55% 0.96%
multithread/1 epoll ops_per_sec 59.56K ops/s 59.27K ops/s 🔴▼ -0.01% 0.89%
multithread/1 uring ops_per_sec 63.66K ops/s 63.42K ops/s 🔴▼ -0.56% 1.11%
multithread/16 epoll ops_per_sec 163.5K ops/s 163.6K ops/s 🟢▲ +0.04% 0.44%
multithread/16 uring ops_per_sec 100.9K ops/s 100.9K ops/s 🔴▼ -0.35% 0.48%
multithread/2 epoll ops_per_sec 87.51K ops/s 87.56K ops/s 🔴▼ -0.06% 0.77%
multithread/2 uring ops_per_sec 75.10K ops/s 74.86K ops/s 🔴▼ -0.45% 0.47%
multithread/4 epoll ops_per_sec 159.6K ops/s 159.9K ops/s 🔴▼ -0.16% 1.70%
multithread/4 uring ops_per_sec 120.2K ops/s 119.4K ops/s 🔴▼ -0.60% 1.22%
multithread/8 epoll ops_per_sec 162.4K ops/s 161.6K ops/s 🔴▼ -0.46% 0.66%
multithread/8 uring ops_per_sec 112.2K ops/s 111.9K ops/s 🔴▼ -0.43% 0.54%
single_conn epoll ops_per_sec 56.93K ops/s 56.57K ops/s 🔴▼ -0.53% 1.12%
single_conn uring ops_per_sec 53.77K ops/s 53.03K ops/s 🔴▼ -0.89% 1.11%
single_conn_lockless epoll ops_per_sec 57.62K ops/s 57.46K ops/s 🟢▲ +0.08% 1.10%
single_conn_lockless uring ops_per_sec 55.44K ops/s 54.85K ops/s 🔴▼ -0.55% 1.11%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 7.12 µs 7.03 µs 🟢▲ +4.69% 5.22%
concurrent/1 uring latency_mean_ns 5.80 µs 6.05 µs 🔴▼ -10.65% 5.58%
concurrent/16 epoll latency_mean_ns 110.08 µs 108.19 µs 🟢▲ +1.72% 0.75%
concurrent/16 uring latency_mean_ns 93.20 µs 93.29 µs 🔴▼ -0.13% 0.60%
concurrent/4 epoll latency_mean_ns 27.83 µs 27.28 µs 🟢▲ +2.47% 0.97%
concurrent/4 uring latency_mean_ns 23.27 µs 23.33 µs 🔴▼ -0.35% 1.41%
concurrent_lockless/1 epoll latency_mean_ns 7.00 µs 6.67 µs 🟢▲ +5.08% 1.04%
concurrent_lockless/1 uring latency_mean_ns 5.64 µs 5.65 µs 🔴▼ -0.13% 0.69%
concurrent_lockless/16 epoll latency_mean_ns 108.55 µs 106.74 µs 🟢▲ +1.69% 0.83%
concurrent_lockless/16 uring latency_mean_ns 92.83 µs 92.81 µs 🟢▲ +0.25% 1.14%
concurrent_lockless/4 epoll latency_mean_ns 27.43 µs 26.72 µs 🟢▲ +2.59% 1.22%
concurrent_lockless/4 uring latency_mean_ns 22.98 µs 22.89 µs 🟢▲ +1.25% 1.53%
pingpong/1 epoll latency_mean_ns 7.21 µs 6.83 µs 🟢▲ +5.45% 4.68%
pingpong/1 uring latency_mean_ns 5.60 µs 5.73 µs 🔴▼ -0.68% 3.49%
pingpong/1024 epoll latency_mean_ns 7.79 µs 7.49 µs 🟢▲ +4.37% 4.22%
pingpong/1024 uring latency_mean_ns 6.21 µs 6.43 µs 🔴▼ -6.85% 5.09%
pingpong/64 epoll latency_mean_ns 7.25 µs 7.01 µs 🟢▲ +4.95% 5.48%
pingpong/64 uring latency_mean_ns 5.94 µs 5.79 µs 🟢▲ +2.88% 6.49%
pingpong_lockless/1 epoll latency_mean_ns 7.10 µs 6.66 µs 🟢▲ +4.71% 4.25%
pingpong_lockless/1 uring latency_mean_ns 5.88 µs 5.72 µs 🟢▲ +1.14% 6.19%
pingpong_lockless/1024 epoll latency_mean_ns 7.53 µs 7.23 µs 🟢▲ +4.10% 5.08%
pingpong_lockless/1024 uring latency_mean_ns 6.26 µs 6.27 µs 🔴▼ -0.24% 6.21%
pingpong_lockless/64 epoll latency_mean_ns 7.16 µs 6.82 µs 🟢▲ +5.06% 4.56%
pingpong_lockless/64 uring latency_mean_ns 5.79 µs 6.03 µs 🔴▼ -9.75% 5.92%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 307.0 MB/s 311.7 MB/s 🟢▲ +1.82% 1.59%
bidirectional/1024 uring bytes_per_sec 353.6 MB/s 353.7 MB/s 🟢▲ +0.57% 1.27%
bidirectional/1048576 epoll bytes_per_sec 3.27 GB/s 3.25 GB/s 🔴▼ -0.57% 1.81%
bidirectional/1048576 uring bytes_per_sec 3.56 GB/s 3.59 GB/s 🟢▲ +1.06% 2.80%
bidirectional/16384 epoll bytes_per_sec 3.06 GB/s 3.11 GB/s 🟢▲ +1.90% 2.57%
bidirectional/16384 uring bytes_per_sec 2.99 GB/s 3.02 GB/s 🟢▲ +1.30% 1.59%
bidirectional/262144 epoll bytes_per_sec 3.22 GB/s 3.25 GB/s 🟢▲ +0.33% 1.92%
bidirectional/262144 uring bytes_per_sec 3.55 GB/s 3.49 GB/s 🔴▼ -3.43% 2.05%
bidirectional/4096 epoll bytes_per_sec 1.00 GB/s 1.02 GB/s 🟢▲ +1.86% 0.36%
bidirectional/4096 uring bytes_per_sec 1.12 GB/s 1.13 GB/s 🟢▲ +1.25% 1.11%
bidirectional/65536 epoll bytes_per_sec 3.00 GB/s 3.00 GB/s 🟢▲ +1.25% 3.04%
bidirectional/65536 uring bytes_per_sec 3.49 GB/s 3.48 GB/s 🟢▲ +1.02% 1.98%
bidirectional_lockless/1024 epoll bytes_per_sec 308.7 MB/s 312.8 MB/s 🟢▲ +0.83% 1.45%
bidirectional_lockless/1024 uring bytes_per_sec 353.6 MB/s 353.5 MB/s 🔴▼ -0.35% 0.87%
bidirectional_lockless/1048576 epoll bytes_per_sec 3.29 GB/s 3.27 GB/s 🔴▼ -2.26% 1.97%
bidirectional_lockless/1048576 uring bytes_per_sec 3.56 GB/s 3.58 GB/s 🟢▲ +0.54% 2.70%
bidirectional_lockless/16384 epoll bytes_per_sec 3.03 GB/s 3.19 GB/s 🟢▲ +4.16% 3.82%
bidirectional_lockless/16384 uring bytes_per_sec 3.04 GB/s 2.98 GB/s 🔴▼ -1.51% 3.83%
bidirectional_lockless/262144 epoll bytes_per_sec 3.23 GB/s 3.27 GB/s 🟢▲ +0.86% 1.67%
bidirectional_lockless/262144 uring bytes_per_sec 3.56 GB/s 3.50 GB/s 🔴▼ -2.57% 1.61%
bidirectional_lockless/4096 epoll bytes_per_sec 1.01 GB/s 1.02 GB/s 🟢▲ +1.61% 0.49%
bidirectional_lockless/4096 uring bytes_per_sec 1.13 GB/s 1.13 GB/s 🟢▲ +0.22% 1.51%
bidirectional_lockless/65536 epoll bytes_per_sec 3.00 GB/s 3.01 GB/s 🟢▲ +1.45% 3.02%
bidirectional_lockless/65536 uring bytes_per_sec 3.53 GB/s 3.49 GB/s 🔴▼ -0.99% 1.35%
unidirectional/1024 epoll bytes_per_sec 299.1 MB/s 308.5 MB/s 🟢▲ +3.37% 0.96%
unidirectional/1024 uring bytes_per_sec 352.4 MB/s 352.1 MB/s 🔴▼ -0.29% 1.01%
unidirectional/1048576 epoll bytes_per_sec 3.40 GB/s 3.35 GB/s 🔴▼ -2.19% 1.79%
unidirectional/1048576 uring bytes_per_sec 3.56 GB/s 3.58 GB/s 🟢▲ +0.44% 2.13%
unidirectional/16384 epoll bytes_per_sec 3.06 GB/s 3.13 GB/s 🟢▲ +2.89% 2.35%
unidirectional/16384 uring bytes_per_sec 3.02 GB/s 3.05 GB/s 🟢▲ +0.19% 2.30%
unidirectional/262144 epoll bytes_per_sec 3.30 GB/s 3.32 GB/s 🔴▼ -0.01% 2.26%
unidirectional/262144 uring bytes_per_sec 3.56 GB/s 3.47 GB/s 🔴▼ -1.96% 1.72%
unidirectional/4096 epoll bytes_per_sec 979.4 MB/s 1.01 GB/s 🟢▲ +2.43% 1.08%
unidirectional/4096 uring bytes_per_sec 1.13 GB/s 1.14 GB/s 🟢▲ +0.58% 1.05%
unidirectional/65536 epoll bytes_per_sec 3.27 GB/s 3.21 GB/s 🔴▼ -0.64% 5.09%
unidirectional/65536 uring bytes_per_sec 3.51 GB/s 3.53 GB/s 🔴▼ -0.24% 2.72%
unidirectional_lockless/1024 epoll bytes_per_sec 302.3 MB/s 311.3 MB/s 🟢▲ +2.53% 1.11%
unidirectional_lockless/1024 uring bytes_per_sec 354.6 MB/s 353.7 MB/s 🔴▼ -0.50% 0.81%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.41 GB/s 3.37 GB/s 🔴▼ -2.47% 2.36%
unidirectional_lockless/1048576 uring bytes_per_sec 3.55 GB/s 3.57 GB/s 🟢▲ +0.23% 2.05%
unidirectional_lockless/16384 epoll bytes_per_sec 3.13 GB/s 3.13 GB/s 🔴▼ -0.69% 2.21%
unidirectional_lockless/16384 uring bytes_per_sec 2.99 GB/s 3.00 GB/s 🔴▼ -0.37% 2.82%
unidirectional_lockless/262144 epoll bytes_per_sec 3.32 GB/s 3.36 GB/s 🟢▲ +2.07% 2.33%
unidirectional_lockless/262144 uring bytes_per_sec 3.55 GB/s 3.46 GB/s 🔴▼ -2.57% 1.93%
unidirectional_lockless/4096 epoll bytes_per_sec 988.3 MB/s 1.02 GB/s 🟢▲ +2.39% 1.11%
unidirectional_lockless/4096 uring bytes_per_sec 1.14 GB/s 1.13 GB/s 🔴▼ -0.66% 0.80%
unidirectional_lockless/65536 epoll bytes_per_sec 3.28 GB/s 3.26 GB/s 🟢▲ +0.19% 5.28%
unidirectional_lockless/65536 uring bytes_per_sec 3.57 GB/s 3.53 GB/s 🔴▼ -2.21% 1.70%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 14.74 µs 14.43 µs 🟢▲ +2.34% 0.93%
concurrent/1 uring latency_mean_ns 13.63 µs 13.61 µs 🟢▲ +0.09% 1.21%
concurrent/16 epoll latency_mean_ns 233.16 µs 230.63 µs 🟢▲ +1.17% 0.22%
concurrent/16 uring latency_mean_ns 220.53 µs 219.99 µs 🟢▲ +0.23% 1.21%
concurrent/4 epoll latency_mean_ns 58.01 µs 57.47 µs 🟢▲ +1.40% 0.96%
concurrent/4 uring latency_mean_ns 54.71 µs 54.60 µs 🟢▲ +0.18% 1.22%
concurrent_lockless/1 epoll latency_mean_ns 14.68 µs 14.39 µs 🟢▲ +2.05% 0.45%
concurrent_lockless/1 uring latency_mean_ns 13.62 µs 13.56 µs 🟢▲ +0.48% 1.21%
concurrent_lockless/16 epoll latency_mean_ns 231.18 µs 229.86 µs 🟢▲ +1.11% 1.16%
concurrent_lockless/16 uring latency_mean_ns 219.31 µs 220.69 µs 🔴▼ -0.06% 0.99%
concurrent_lockless/4 epoll latency_mean_ns 57.69 µs 57.32 µs 🟢▲ +1.10% 1.21%
concurrent_lockless/4 uring latency_mean_ns 54.70 µs 54.58 µs 🟢▲ +0.28% 0.80%
pingpong/1 epoll latency_mean_ns 14.74 µs 14.30 µs 🟢▲ +2.75% 1.02%
pingpong/1 uring latency_mean_ns 13.58 µs 13.62 µs 🔴▼ -0.18% 0.87%
pingpong/1024 epoll latency_mean_ns 15.04 µs 14.69 µs 🟢▲ +2.51% 0.83%
pingpong/1024 uring latency_mean_ns 13.83 µs 13.94 µs 🔴▼ -0.60% 1.08%
pingpong/64 epoll latency_mean_ns 14.77 µs 14.36 µs 🟢▲ +2.41% 1.06%
pingpong/64 uring latency_mean_ns 13.59 µs 13.67 µs 🔴▼ -0.19% 1.00%
pingpong_lockless/1 epoll latency_mean_ns 14.51 µs 14.30 µs 🟢▲ +1.78% 0.83%
pingpong_lockless/1 uring latency_mean_ns 13.48 µs 13.56 µs 🔴▼ -0.12% 1.18%
pingpong_lockless/1024 epoll latency_mean_ns 14.93 µs 14.67 µs 🟢▲ +1.81% 0.72%
pingpong_lockless/1024 uring latency_mean_ns 13.86 µs 13.81 µs 🟢▲ +0.47% 1.28%
pingpong_lockless/64 epoll latency_mean_ns 14.62 µs 14.36 µs 🟢▲ +2.21% 0.98%
pingpong_lockless/64 uring latency_mean_ns 13.58 µs 13.57 µs 🟢▲ +0.06% 1.20%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 133.5 MB/s 134.0 MB/s 🟢▲ +0.36% 0.19%
bidirectional/1024 uring bytes_per_sec 150.1 MB/s 149.9 MB/s 🔴▼ -0.02% 0.84%
bidirectional/1048576 epoll bytes_per_sec 3.27 GB/s 3.35 GB/s 🟢▲ +2.24% 1.61%
bidirectional/1048576 uring bytes_per_sec 3.33 GB/s 3.31 GB/s 🔴▼ -1.25% 1.09%
bidirectional/16384 epoll bytes_per_sec 1.62 GB/s 1.64 GB/s 🟢▲ +1.03% 1.01%
bidirectional/16384 uring bytes_per_sec 1.61 GB/s 1.61 GB/s 🔴▼ -0.04% 0.87%
bidirectional/262144 epoll bytes_per_sec 3.22 GB/s 3.22 GB/s 🟢▲ +0.09% 0.80%
bidirectional/262144 uring bytes_per_sec 3.27 GB/s 3.25 GB/s 🔴▼ -1.62% 1.51%
bidirectional/4096 epoll bytes_per_sec 502.9 MB/s 504.3 MB/s 🟢▲ +0.24% 0.38%
bidirectional/4096 uring bytes_per_sec 522.8 MB/s 522.3 MB/s 🟢▲ +0.20% 0.85%
bidirectional/65536 epoll bytes_per_sec 2.61 GB/s 2.61 GB/s 🔴▼ -0.51% 3.83%
bidirectional/65536 uring bytes_per_sec 2.85 GB/s 2.86 GB/s 🔴▼ -0.38% 1.72%
bidirectional_lockless/1024 epoll bytes_per_sec 134.7 MB/s 134.6 MB/s 🟢▲ +0.33% 1.10%
bidirectional_lockless/1024 uring bytes_per_sec 150.6 MB/s 150.3 MB/s 🟢▲ +0.21% 0.96%
bidirectional_lockless/1048576 epoll bytes_per_sec 3.28 GB/s 3.37 GB/s 🟢▲ +2.48% 1.32%
bidirectional_lockless/1048576 uring bytes_per_sec 3.33 GB/s 3.32 GB/s 🟢▲ +0.52% 1.33%
bidirectional_lockless/16384 epoll bytes_per_sec 1.63 GB/s 1.62 GB/s 🔴▼ -0.43% 1.39%
bidirectional_lockless/16384 uring bytes_per_sec 1.63 GB/s 1.62 GB/s 🟢▲ +0.76% 1.08%
bidirectional_lockless/262144 epoll bytes_per_sec 3.23 GB/s 3.24 GB/s 🟢▲ +0.25% 0.59%
bidirectional_lockless/262144 uring bytes_per_sec 3.25 GB/s 3.24 GB/s 🟢▲ +0.16% 2.28%
bidirectional_lockless/4096 epoll bytes_per_sec 508.0 MB/s 508.8 MB/s 🟢▲ +0.30% 0.78%
bidirectional_lockless/4096 uring bytes_per_sec 524.4 MB/s 524.1 MB/s 🟢▲ +0.18% 1.06%
bidirectional_lockless/65536 epoll bytes_per_sec 2.66 GB/s 2.62 GB/s 🔴▼ -0.48% 2.86%
bidirectional_lockless/65536 uring bytes_per_sec 2.91 GB/s 2.92 GB/s 🔴▼ -0.22% 1.45%
multithread/2 epoll bytes_per_sec 3.70 GB/s 3.72 GB/s 🟢▲ +0.81% 0.73%
multithread/2 uring bytes_per_sec 4.19 GB/s 4.20 GB/s 🟢▲ +0.34% 0.40%
multithread/4 epoll bytes_per_sec 5.89 GB/s 6.05 GB/s 🟢▲ +2.65% 0.99%
multithread/4 uring bytes_per_sec 6.69 GB/s 6.64 GB/s 🔴▼ -0.78% 0.48%
multithread/8 epoll bytes_per_sec 6.36 GB/s 6.42 GB/s 🟢▲ +1.05% 0.80%
multithread/8 uring bytes_per_sec 6.79 GB/s 6.81 GB/s 🟢▲ +0.69% 0.36%
unidirectional/1024 epoll bytes_per_sec 124.9 MB/s 125.8 MB/s 🟢▲ +0.69% 0.44%
unidirectional/1024 uring bytes_per_sec 148.3 MB/s 148.3 MB/s 🟢▲ +0.47% 1.21%
unidirectional/1048576 epoll bytes_per_sec 3.37 GB/s 3.36 GB/s 🔴▼ -0.64% 0.70%
unidirectional/1048576 uring bytes_per_sec 3.41 GB/s 3.37 GB/s 🔴▼ -0.86% 1.14%
unidirectional/16384 epoll bytes_per_sec 1.54 GB/s 1.53 GB/s 🔴▼ -0.17% 1.72%
unidirectional/16384 uring bytes_per_sec 1.70 GB/s 1.67 GB/s 🔴▼ -0.37% 4.05%
unidirectional/262144 epoll bytes_per_sec 3.31 GB/s 3.33 GB/s 🟢▲ +0.02% 1.36%
unidirectional/262144 uring bytes_per_sec 3.27 GB/s 3.23 GB/s 🔴▼ -1.56% 0.87%
unidirectional/4096 epoll bytes_per_sec 469.7 MB/s 473.4 MB/s 🟢▲ +0.50% 0.57%
unidirectional/4096 uring bytes_per_sec 519.0 MB/s 519.1 MB/s 🔴▼ -0.47% 1.15%
unidirectional/65536 epoll bytes_per_sec 2.69 GB/s 2.63 GB/s 🔴▼ -1.90% 4.26%
unidirectional/65536 uring bytes_per_sec 2.79 GB/s 2.83 GB/s 🔴▼ -0.91% 3.32%
unidirectional_lockless/1024 epoll bytes_per_sec 126.1 MB/s 126.4 MB/s 🟢▲ +0.18% 0.22%
unidirectional_lockless/1024 uring bytes_per_sec 147.8 MB/s 149.4 MB/s 🟢▲ +1.02% 1.17%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.29 GB/s 3.30 GB/s 🟢▲ +0.47% 1.51%
unidirectional_lockless/1048576 uring bytes_per_sec 3.42 GB/s 3.35 GB/s 🔴▼ -2.45% 1.81%
unidirectional_lockless/16384 epoll bytes_per_sec 1.54 GB/s 1.56 GB/s 🟢▲ +1.61% 1.67%
unidirectional_lockless/16384 uring bytes_per_sec 1.71 GB/s 1.72 GB/s 🟢▲ +0.53% 1.42%
unidirectional_lockless/262144 epoll bytes_per_sec 3.31 GB/s 3.32 GB/s 🟢▲ +1.09% 1.25%
unidirectional_lockless/262144 uring bytes_per_sec 3.29 GB/s 3.26 GB/s 🔴▼ -1.18% 1.84%
unidirectional_lockless/4096 epoll bytes_per_sec 472.7 MB/s 475.5 MB/s 🟢▲ +0.80% 0.65%
unidirectional_lockless/4096 uring bytes_per_sec 525.3 MB/s 523.9 MB/s 🔴▼ -0.31% 1.34%
unidirectional_lockless/65536 epoll bytes_per_sec 2.78 GB/s 2.79 GB/s 🟢▲ +0.39% 2.02%
unidirectional_lockless/65536 uring bytes_per_sec 2.81 GB/s 2.82 GB/s 🔴▼ -0.93% 2.61%
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.55K ops/s 1.55K ops/s 🔴▼ -0.44% 0.36%
burst/100 iocp ops_per_sec 155.4 ops/s 155.7 ops/s 🟢▲ +0.10% 0.77%
burst_lockless/10 iocp ops_per_sec 1.56K ops/s 1.55K ops/s 🔴▼ -0.32% 0.18%
burst_lockless/100 iocp ops_per_sec 158.4 ops/s 158.6 ops/s 🔴▼ -0.31% 0.65%
concurrent/1 iocp ops_per_sec 12.37K ops/s 12.34K ops/s 🔴▼ -0.18% 0.34%
concurrent/16 iocp ops_per_sec 13.32K ops/s 13.30K ops/s 🔴▼ -0.18% 0.38%
concurrent/4 iocp ops_per_sec 13.01K ops/s 12.99K ops/s 🔴▼ -0.34% 0.47%
sequential iocp ops_per_sec 12.24K ops/s 12.28K ops/s 🔴▼ -0.11% 2.21%
sequential_lockless iocp ops_per_sec 12.37K ops/s 12.31K ops/s 🔴▼ -0.42% 0.26%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 iocp ops_per_sec 7.31K ops/s 7.28K ops/s 🔴▼ -0.44% 0.23%
concurrent_parents/16 iocp ops_per_sec 6.73K ops/s 6.69K ops/s 🔴▼ -0.54% 1.01%
concurrent_parents/4 iocp ops_per_sec 7.21K ops/s 7.22K ops/s 🟢▲ +0.19% 0.82%
concurrent_parents_lockless/1 iocp ops_per_sec 7.32K ops/s 7.33K ops/s 🟢▲ +0.15% 0.19%
concurrent_parents_lockless/16 iocp ops_per_sec 6.76K ops/s 6.72K ops/s 🔴▼ -0.50% 1.37%
concurrent_parents_lockless/4 iocp ops_per_sec 7.22K ops/s 7.23K ops/s 🔴▼ -0.07% 0.83%
fork_join/1 iocp ops_per_sec 111.4K ops/s 110.9K ops/s 🔴▼ -0.32% 0.41%
fork_join/16 iocp ops_per_sec 7.30K ops/s 7.29K ops/s 🟢▲ +0.04% 0.34%
fork_join/4 iocp ops_per_sec 29.05K ops/s 28.88K ops/s 🔴▼ -0.50% 0.39%
fork_join/64 iocp ops_per_sec 1.80K ops/s 1.81K ops/s 🔴▼ -0.20% 1.90%
fork_join_lockless/1 iocp ops_per_sec 112.0K ops/s 111.3K ops/s 🔴▼ -0.51% 0.47%
fork_join_lockless/16 iocp ops_per_sec 7.30K ops/s 7.29K ops/s 🔴▼ -0.09% 0.36%
fork_join_lockless/4 iocp ops_per_sec 29.05K ops/s 28.92K ops/s 🔴▼ -0.28% 0.41%
fork_join_lockless/64 iocp ops_per_sec 1.81K ops/s 1.81K ops/s 🔴▼ -0.15% 0.95%
nested/16 iocp ops_per_sec 1.78K ops/s 1.78K ops/s 🔴▼ -0.19% 0.89%
nested/4 iocp ops_per_sec 7.17K ops/s 7.15K ops/s 🔴▼ -0.31% 0.28%
nested_lockless/16 iocp ops_per_sec 1.78K ops/s 1.78K ops/s 🔴▼ -0.08% 0.67%
nested_lockless/4 iocp ops_per_sec 7.17K ops/s 7.14K ops/s 🔴▼ -0.35% 0.33%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp ops_per_sec 110.6K ops/s 110.4K ops/s 🔴▼ -0.07% 0.35%
concurrent/16 iocp ops_per_sec 107.6K ops/s 107.2K ops/s 🔴▼ -0.40% 0.23%
concurrent/32 iocp ops_per_sec 106.9K ops/s 106.8K ops/s 🔴▼ -0.16% 0.25%
concurrent/4 iocp ops_per_sec 108.4K ops/s 108.1K ops/s 🔴▼ -0.42% 0.39%
multithread/1 iocp ops_per_sec 106.9K ops/s 106.8K ops/s 🔴▼ -0.09% 0.29%
multithread/16 iocp ops_per_sec 266.3K ops/s 267.1K ops/s 🟢▲ +0.24% 0.42%
multithread/2 iocp ops_per_sec 178.6K ops/s 180.4K ops/s 🟢▲ +1.04% 1.06%
multithread/4 iocp ops_per_sec 225.6K ops/s 225.3K ops/s 🔴▼ -0.53% 0.77%
multithread/8 iocp ops_per_sec 266.9K ops/s 266.6K ops/s 🟢▲ +0.09% 0.54%
single_conn iocp ops_per_sec 110.5K ops/s 110.0K ops/s 🔴▼ -0.21% 0.37%
single_conn_lockless iocp ops_per_sec 110.5K ops/s 110.4K ops/s 🔴▼ -0.10% 0.27%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp latency_mean_ns 7.71 µs 7.71 µs 🔴▼ -0.08% 0.23%
concurrent/16 iocp latency_mean_ns 132.51 µs 128.61 µs 🟢▲ +3.31% 4.26%
concurrent/4 iocp latency_mean_ns 30.79 µs 30.83 µs 🟢▲ +0.16% 0.29%
concurrent_lockless/1 iocp latency_mean_ns 7.69 µs 7.74 µs 🔴▼ -0.68% 0.32%
concurrent_lockless/16 iocp latency_mean_ns 122.60 µs 123.02 µs 🟢▲ +0.06% 0.78%
concurrent_lockless/4 iocp latency_mean_ns 30.77 µs 30.87 µs 🔴▼ -0.28% 0.34%
pingpong/1 iocp latency_mean_ns 7.71 µs 7.70 µs 🟢▲ +0.29% 0.25%
pingpong/1024 iocp latency_mean_ns 7.79 µs 7.79 µs 🟢▲ +0.22% 0.54%
pingpong/64 iocp latency_mean_ns 7.70 µs 7.71 µs 🔴▼ -0.11% 0.45%
pingpong_lockless/1 iocp latency_mean_ns 7.65 µs 7.69 µs 🔴▼ -0.46% 0.31%
pingpong_lockless/1024 iocp latency_mean_ns 7.80 µs 7.80 µs 🟢▲ +0.14% 0.31%
pingpong_lockless/64 iocp latency_mean_ns 7.69 µs 7.74 µs 🔴▼ -0.64% 0.27%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 iocp bytes_per_sec 278.4 MB/s 278.5 MB/s 🟢▲ +0.04% 0.31%
bidirectional/1048576 iocp bytes_per_sec 4.64 GB/s 4.94 GB/s 🟢▲ +5.89% 5.86%
bidirectional/16384 iocp bytes_per_sec 3.73 GB/s 3.62 GB/s 🔴▼ -0.95% 4.78%
bidirectional/262144 iocp bytes_per_sec 9.56 GB/s 8.93 GB/s 🔴▼ -0.54% 10.38%
bidirectional/4096 iocp bytes_per_sec 1.07 GB/s 1.06 GB/s 🔴▼ -1.80% 1.30%
bidirectional/65536 iocp bytes_per_sec 9.11 GB/s 8.37 GB/s 🔴▼ -1.63% 11.72%
bidirectional_lockless/1024 iocp bytes_per_sec 278.8 MB/s 277.7 MB/s 🔴▼ -0.38% 0.37%
bidirectional_lockless/1048576 iocp bytes_per_sec 4.94 GB/s 5.15 GB/s 🟢▲ +3.56% 5.67%
bidirectional_lockless/16384 iocp bytes_per_sec 3.71 GB/s 3.69 GB/s 🔴▼ -0.81% 0.63%
bidirectional_lockless/262144 iocp bytes_per_sec 9.66 GB/s 9.14 GB/s 🔴▼ -1.04% 7.62%
bidirectional_lockless/4096 iocp bytes_per_sec 1.07 GB/s 1.06 GB/s 🔴▼ -0.41% 0.33%
bidirectional_lockless/65536 iocp bytes_per_sec 9.00 GB/s 8.94 GB/s 🔴▼ -0.71% 1.16%
multithread/2 iocp bytes_per_sec 12.69 GB/s 12.61 GB/s 🔴▼ -0.74% 0.79%
multithread/4 iocp bytes_per_sec 17.00 GB/s 16.99 GB/s 🟢▲ +0.35% 0.99%
multithread/8 iocp bytes_per_sec 18.25 GB/s 18.38 GB/s 🟢▲ +0.16% 1.20%
unidirectional/1024 iocp bytes_per_sec 281.1 MB/s 281.5 MB/s 🟢▲ +0.25% 0.46%
unidirectional/1048576 iocp bytes_per_sec 3.94 GB/s 3.83 GB/s 🔴▼ -4.67% 5.18%
unidirectional/16384 iocp bytes_per_sec 3.76 GB/s 3.77 GB/s 🟢▲ +0.13% 0.51%
unidirectional/262144 iocp bytes_per_sec 8.34 GB/s 8.52 GB/s 🟢▲ +2.57% 6.74%
unidirectional/4096 iocp bytes_per_sec 1.08 GB/s 1.08 GB/s 🔴▼ -0.15% 0.40%
unidirectional/65536 iocp bytes_per_sec 8.83 GB/s 9.12 GB/s 🔴▼ -0.54% 10.70%
unidirectional_lockless/1024 iocp bytes_per_sec 281.9 MB/s 281.9 MB/s 🔴▼ -0.12% 0.30%
unidirectional_lockless/1048576 iocp bytes_per_sec 4.36 GB/s 4.48 GB/s 🟢▲ +5.89% 5.08%
unidirectional_lockless/16384 iocp bytes_per_sec 3.78 GB/s 3.77 GB/s 🔴▼ -0.24% 0.53%
unidirectional_lockless/262144 iocp bytes_per_sec 9.76 GB/s 9.69 GB/s 🟢▲ +0.13% 2.16%
unidirectional_lockless/4096 iocp bytes_per_sec 1.08 GB/s 1.08 GB/s 🔴▼ -0.31% 0.53%
unidirectional_lockless/65536 iocp bytes_per_sec 9.31 GB/s 9.35 GB/s 🔴▼ -0.19% 1.51%
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.56K ops/s 4.82K ops/s 🟢▲ +4.61% 1.79%
burst/100 kqueue ops_per_sec 467.9 ops/s 471.4 ops/s 🟢▲ +1.51% 1.39%
burst_lockless/10 kqueue ops_per_sec 4.62K ops/s 4.84K ops/s 🟢▲ +5.15% 0.71%
burst_lockless/100 kqueue ops_per_sec 475.3 ops/s 472.3 ops/s 🟢▲ +0.14% 2.05%
concurrent/1 kqueue ops_per_sec 20.59K ops/s 20.56K ops/s 🔴▼ -0.08% 0.89%
concurrent/16 kqueue ops_per_sec 37.70K ops/s 37.54K ops/s 🔴▼ -0.56% 0.68%
concurrent/4 kqueue ops_per_sec 29.30K ops/s 29.46K ops/s 🟢▲ +0.46% 0.36%
sequential kqueue ops_per_sec 21.08K ops/s 20.91K ops/s 🔴▼ -0.31% 0.88%
sequential_lockless kqueue ops_per_sec 20.95K ops/s 20.94K ops/s 🔴▼ -0.09% 0.87%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 kqueue ops_per_sec 8.16K ops/s 8.17K ops/s 🟢▲ +0.04% 1.57%
concurrent_parents/16 kqueue ops_per_sec 7.14K ops/s 6.65K ops/s 🔴▼ -2.48% 21.10%
concurrent_parents/4 kqueue ops_per_sec 8.39K ops/s 8.54K ops/s 🟢▲ +0.82% 1.60%
concurrent_parents_lockless/1 kqueue ops_per_sec 8.25K ops/s 8.28K ops/s 🟢▲ +0.27% 1.77%
concurrent_parents_lockless/16 kqueue ops_per_sec 7.17K ops/s 7.09K ops/s 🟢▲ +3.91% 21.86%
concurrent_parents_lockless/4 kqueue ops_per_sec 8.48K ops/s 8.48K ops/s 🟢▲ +0.80% 2.20%
fork_join/1 kqueue ops_per_sec 49.15K ops/s 49.96K ops/s 🟢▲ +1.60% 0.74%
fork_join/16 kqueue ops_per_sec 8.17K ops/s 8.20K ops/s 🟢▲ +0.56% 1.06%
fork_join/4 kqueue ops_per_sec 23.53K ops/s 24.11K ops/s 🟢▲ +2.55% 0.73%
fork_join/64 kqueue ops_per_sec 2.12K ops/s 2.13K ops/s 🟢▲ +0.77% 2.80%
fork_join_lockless/1 kqueue ops_per_sec 50.35K ops/s 51.51K ops/s 🟢▲ +2.40% 0.35%
fork_join_lockless/16 kqueue ops_per_sec 8.29K ops/s 8.29K ops/s 🔴▼ -0.20% 1.87%
fork_join_lockless/4 kqueue ops_per_sec 23.68K ops/s 24.26K ops/s 🟢▲ +2.50% 0.42%
fork_join_lockless/64 kqueue ops_per_sec 2.14K ops/s 2.15K ops/s 🟢▲ +0.69% 2.52%
nested/16 kqueue ops_per_sec 2.10K ops/s 2.15K ops/s 🟢▲ +0.91% 2.83%
nested/4 kqueue ops_per_sec 8.10K ops/s 8.18K ops/s 🟢▲ +1.49% 1.34%
nested_lockless/16 kqueue ops_per_sec 2.13K ops/s 2.17K ops/s 🟢▲ +0.91% 2.12%
nested_lockless/4 kqueue ops_per_sec 8.21K ops/s 8.36K ops/s 🟢▲ +2.03% 1.50%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue ops_per_sec 49.73K ops/s 49.55K ops/s 🔴▼ -0.42% 0.34%
concurrent/16 kqueue ops_per_sec 130.6K ops/s 130.6K ops/s 🟢▲ +0.52% 0.54%
concurrent/32 kqueue ops_per_sec 129.5K ops/s 130.2K ops/s 🟢▲ +1.11% 1.08%
concurrent/4 kqueue ops_per_sec 89.93K ops/s 90.54K ops/s 🟢▲ +0.79% 1.01%
multithread/1 kqueue ops_per_sec 129.8K ops/s 129.2K ops/s 🔴▼ -1.61% 1.22%
multithread/16 kqueue ops_per_sec 133.3K ops/s 132.8K ops/s 🔴▼ -0.70% 0.44%
multithread/2 kqueue ops_per_sec 184.7K ops/s 185.3K ops/s 🟢▲ +0.84% 1.00%
multithread/4 kqueue ops_per_sec 162.9K ops/s 161.9K ops/s 🔴▼ -1.07% 0.56%
multithread/8 kqueue ops_per_sec 138.5K ops/s 137.4K ops/s 🔴▼ -1.24% 1.32%
single_conn kqueue ops_per_sec 49.61K ops/s 49.51K ops/s 🔴▼ -0.50% 0.59%
single_conn_lockless kqueue ops_per_sec 50.12K ops/s 49.78K ops/s 🔴▼ -0.51% 0.44%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 1.84 µs 1.71 µs 🟢▲ +6.65% 0.68%
concurrent/16 kqueue latency_mean_ns 27.34 µs 26.89 µs 🟢▲ +1.79% 0.53%
concurrent/4 kqueue latency_mean_ns 6.86 µs 6.69 µs 🟢▲ +2.48% 0.54%
concurrent_lockless/1 kqueue latency_mean_ns 1.81 µs 1.70 µs 🟢▲ +6.33% 0.69%
concurrent_lockless/16 kqueue latency_mean_ns 27.07 µs 26.65 µs 🟢▲ +1.29% 0.68%
concurrent_lockless/4 kqueue latency_mean_ns 6.80 µs 6.64 µs 🟢▲ +2.30% 0.95%
pingpong/1 kqueue latency_mean_ns 1.83 µs 1.71 µs 🟢▲ +6.42% 0.65%
pingpong/1024 kqueue latency_mean_ns 1.93 µs 1.81 µs 🟢▲ +6.18% 0.69%
pingpong/64 kqueue latency_mean_ns 1.83 µs 1.72 µs 🟢▲ +5.95% 0.51%
pingpong_lockless/1 kqueue latency_mean_ns 1.81 µs 1.70 µs 🟢▲ +6.02% 0.82%
pingpong_lockless/1024 kqueue latency_mean_ns 1.92 µs 1.80 µs 🟢▲ +5.87% 0.55%
pingpong_lockless/64 kqueue latency_mean_ns 1.82 µs 1.70 µs 🟢▲ +6.16% 0.68%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 1.29 GB/s 1.32 GB/s 🟢▲ +1.92% 0.55%
bidirectional/1048576 kqueue bytes_per_sec 3.92 GB/s 3.90 GB/s 🔴▼ -0.98% 0.60%
bidirectional/16384 kqueue bytes_per_sec 3.92 GB/s 3.90 GB/s 🔴▼ -0.31% 0.75%
bidirectional/262144 kqueue bytes_per_sec 3.89 GB/s 3.90 GB/s 🔴▼ -0.42% 0.85%
bidirectional/4096 kqueue bytes_per_sec 2.94 GB/s 2.93 GB/s 🔴▼ -0.29% 0.52%
bidirectional/65536 kqueue bytes_per_sec 3.90 GB/s 3.90 GB/s 🔴▼ -0.66% 0.92%
bidirectional_lockless/1024 kqueue bytes_per_sec 1.30 GB/s 1.32 GB/s 🟢▲ +1.73% 0.65%
bidirectional_lockless/1048576 kqueue bytes_per_sec 3.95 GB/s 3.96 GB/s 🔴▼ -0.25% 1.14%
bidirectional_lockless/16384 kqueue bytes_per_sec 4.00 GB/s 3.96 GB/s 🔴▼ -1.31% 0.70%
bidirectional_lockless/262144 kqueue bytes_per_sec 3.98 GB/s 3.97 GB/s 🔴▼ -0.43% 0.83%
bidirectional_lockless/4096 kqueue bytes_per_sec 2.99 GB/s 2.97 GB/s 🔴▼ -0.50% 0.52%
bidirectional_lockless/65536 kqueue bytes_per_sec 3.98 GB/s 3.98 GB/s 🔴▼ -0.40% 1.09%
unidirectional/1024 kqueue bytes_per_sec 1.27 GB/s 1.31 GB/s 🟢▲ +3.12% 0.39%
unidirectional/1048576 kqueue bytes_per_sec 3.54 GB/s 3.55 GB/s 🟢▲ +0.39% 0.73%
unidirectional/16384 kqueue bytes_per_sec 3.55 GB/s 3.55 GB/s 🔴▼ -0.05% 0.62%
unidirectional/262144 kqueue bytes_per_sec 3.55 GB/s 3.55 GB/s 🟢▲ +0.01% 0.73%
unidirectional/4096 kqueue bytes_per_sec 2.73 GB/s 2.73 GB/s 🟢▲ +0.09% 0.32%
unidirectional/65536 kqueue bytes_per_sec 3.55 GB/s 3.55 GB/s 🟢▲ +0.44% 0.53%
unidirectional_lockless/1024 kqueue bytes_per_sec 1.28 GB/s 1.32 GB/s 🟢▲ +3.42% 0.61%
unidirectional_lockless/1048576 kqueue bytes_per_sec 3.61 GB/s 3.60 GB/s 🔴▼ -0.18% 0.70%
unidirectional_lockless/16384 kqueue bytes_per_sec 3.62 GB/s 3.62 GB/s 🟢▲ +0.38% 0.64%
unidirectional_lockless/262144 kqueue bytes_per_sec 3.61 GB/s 3.61 GB/s 🟢▲ +0.16% 0.63%
unidirectional_lockless/4096 kqueue bytes_per_sec 2.76 GB/s 2.76 GB/s 🟢▲ +0.02% 0.58%
unidirectional_lockless/65536 kqueue bytes_per_sec 3.61 GB/s 3.60 GB/s 🔴▼ -0.60% 0.56%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 18.70 µs 18.64 µs 🟢▲ +0.38% 0.42%
concurrent/16 kqueue latency_mean_ns 120.84 µs 120.73 µs 🔴▼ -0.14% 1.02%
concurrent/4 kqueue latency_mean_ns 43.03 µs 42.93 µs 🟢▲ +1.00% 0.84%
concurrent_lockless/1 kqueue latency_mean_ns 18.65 µs 18.61 µs 🟢▲ +0.40% 0.37%
concurrent_lockless/16 kqueue latency_mean_ns 120.56 µs 120.35 µs 🟢▲ +0.14% 1.13%
concurrent_lockless/4 kqueue latency_mean_ns 42.44 µs 42.42 µs 🟢▲ +0.53% 0.52%
pingpong/1 kqueue latency_mean_ns 15.45 µs 15.39 µs 🟢▲ +0.82% 1.17%
pingpong/1024 kqueue latency_mean_ns 19.02 µs 19.05 µs 🔴▼ -0.22% 0.25%
pingpong/64 kqueue latency_mean_ns 18.72 µs 18.67 µs 🟢▲ +0.24% 0.51%
pingpong_lockless/1 kqueue latency_mean_ns 15.36 µs 15.29 µs 🟢▲ +0.44% 0.31%
pingpong_lockless/1024 kqueue latency_mean_ns 19.05 µs 19.13 µs 🔴▼ -0.49% 0.30%
pingpong_lockless/64 kqueue latency_mean_ns 18.67 µs 18.62 µs 🟢▲ +0.49% 0.55%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 475.6 MB/s 475.3 MB/s 🟢▲ +0.23% 0.99%
bidirectional/1048576 kqueue bytes_per_sec 7.85 GB/s 6.87 GB/s 🔴▼ -12.32% 4.87%
bidirectional/16384 kqueue bytes_per_sec 4.56 GB/s 4.53 GB/s 🔴▼ -0.55% 1.71%
bidirectional/262144 kqueue bytes_per_sec 8.97 GB/s 8.83 GB/s 🟢▲ +0.44% 3.65%
bidirectional/4096 kqueue bytes_per_sec 1.83 GB/s 1.82 GB/s 🔴▼ -0.09% 0.71%
bidirectional/65536 kqueue bytes_per_sec 7.58 GB/s 7.55 GB/s 🟢▲ +0.13% 2.08%
bidirectional_lockless/1024 kqueue bytes_per_sec 478.2 MB/s 476.5 MB/s 🟢▲ +0.01% 0.90%
bidirectional_lockless/1048576 kqueue bytes_per_sec 7.71 GB/s 6.96 GB/s 🔴▼ -10.80% 6.21%
bidirectional_lockless/16384 kqueue bytes_per_sec 4.57 GB/s 4.58 GB/s 🔴▼ -0.10% 1.57%
bidirectional_lockless/262144 kqueue bytes_per_sec 8.87 GB/s 8.91 GB/s 🔴▼ -0.41% 2.59%
bidirectional_lockless/4096 kqueue bytes_per_sec 1.83 GB/s 1.83 GB/s 🟢▲ +0.13% 0.80%
bidirectional_lockless/65536 kqueue bytes_per_sec 7.52 GB/s 7.52 GB/s 🟢▲ +0.23% 1.24%
multithread/2 kqueue bytes_per_sec 7.57 GB/s 7.35 GB/s 🔴▼ -2.97% 4.22%
multithread/4 kqueue bytes_per_sec 3.66 GB/s 3.75 GB/s 🟢▲ +4.64% 6.06%
multithread/8 kqueue bytes_per_sec 3.23 GB/s 3.43 GB/s 🟢▲ +5.52% 8.41%
unidirectional/1024 kqueue bytes_per_sec 457.7 MB/s 459.2 MB/s 🟢▲ +0.39% 2.90%
unidirectional/1048576 kqueue bytes_per_sec 9.03 GB/s 8.80 GB/s 🔴▼ -0.35% 5.69%
unidirectional/16384 kqueue bytes_per_sec 4.49 GB/s 4.50 GB/s 🟢▲ +0.71% 1.90%
unidirectional/262144 kqueue bytes_per_sec 9.19 GB/s 9.05 GB/s 🔴▼ -1.10% 4.23%
unidirectional/4096 kqueue bytes_per_sec 1.80 GB/s 1.82 GB/s 🟢▲ +0.87% 1.13%
unidirectional/65536 kqueue bytes_per_sec 7.47 GB/s 7.35 GB/s 🔴▼ -0.55% 2.16%
unidirectional_lockless/1024 kqueue bytes_per_sec 478.0 MB/s 483.8 MB/s 🟢▲ +2.16% 2.74%
unidirectional_lockless/1048576 kqueue bytes_per_sec 9.04 GB/s 8.87 GB/s 🟢▲ +0.36% 4.96%
unidirectional_lockless/16384 kqueue bytes_per_sec 4.53 GB/s 4.49 GB/s 🔴▼ -1.38% 2.51%
unidirectional_lockless/262144 kqueue bytes_per_sec 9.05 GB/s 9.08 GB/s 🟢▲ +1.21% 3.90%
unidirectional_lockless/4096 kqueue bytes_per_sec 1.81 GB/s 1.83 GB/s 🟢▲ +0.97% 1.69%
unidirectional_lockless/65536 kqueue bytes_per_sec 7.42 GB/s 7.49 GB/s 🟢▲ +0.60% 1.82%

Run & raw JSON artifacts · flag rule: |median Δ| > max(2%, 3×CV of the noisier side) · advisory only

@sgerbino
sgerbino force-pushed the pr/recycling-free-list branch from 1e59c16 to f4b0d0d Compare November 12, 2026 19:16
@coderabbitai

coderabbitai Bot commented Nov 12, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

When the reactor sentinel reached the front with handlers still queued,
the scheduler polled the reactor without blocking. Those handlers were
mostly posted by the pass that just ran, such as a coroutine an I/O
completion woke, so the poll usually found nothing.

The sentinel now moves behind the queued handlers once and polls on
its next turn regardless, so handlers that keep reposting still cannot
starve I/O. restart() forgets a deferral still pending, so a run
stopped with the sentinel moved back doesn't cost the next run its own.
poll() and poll_one() are unchanged.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

2 participants