Skip to content

Run performance benchmarks on PRs with a per-platform verdict - #374

Merged
sgerbino merged 1 commit into
developfrom
pr/pr-benchmarks
Sep 30, 2026
Merged

sgerbino merged 1 commit into
developfrom
pr/pr-benchmarks

Conversation

@sgerbino

@sgerbino sgerbino commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Implements #343: every PR touching include/, src/, or bench/ gets an advisory benchmark comment — head vs merge-base, per platform, per backend — posted by the workflow and updated in place on each push.

How it works

  • Machines: the three dedicated self-hosted runners (Linux X64: epoll + uring, Windows X64: iocp, macOS ARM64: kqueue).
  • Method: both sides are built at SHAs pinned at gate time, then the full bench suite runs in interleaved base/head passes (ABBA order so linear drift cancels), 5 iterations × 1.5 s per benchmark. Iterations/duration/category are workflow_dispatch overrides.
  • Flag rule: |median paired Δ| > max(2 %, 3 × CV of the noisier side). The noise floor is measured live from the same session's samples — no stored calibration to go stale. A workflow_dispatch mode=aa benchmarks the merge-base against itself to audit the rule whenever hardware or the suite changes.
  • Advisory: flagged rows never fail the workflow; a bench build failure on head does fail that platform's job.
  • Suite drift: benchmarks added/removed by the PR are listed, not compared; malformed inputs are warned and skipped — the report never fails a job over suite shape. Oversized reports degrade to a condensed comment (GitHub's 64 KB cap).
  • Raw per-run JSON + summaries are uploaded as bench-<platform> artifacts; the comment links the run.

Security model (pull_request_target)

  • Workflow definition, compare.py, and composite actions always execute from the trusted base commit — never from the PR.
  • Only PRs from repo collaborators benchmark automatically (org membership alone is deliberately not enough for these machines). Everyone else's run only when a maintainer applies the benchmark label, which is consumed on use and stripped on later pushes — each approval covers exactly the reviewed diff. The label test matches the label that fired the event (no stale-label replay), and a failed label-consume fails the gate closed.
  • Unrelated label churn neither starts runs nor cancels one in flight. Head/base SHAs are pinned in gate outputs; bench jobs run with a read-only, non-persisted token and no secrets.

Validation

  • compare.py: 24 local unit tests; validated against real bench output, including a doctored −10 % regression that flags correctly at N=5.
  • Pipeline proven end-to-end on a fork (hosted runners), then on all three dedicated machines (uring rows confirmed on Linux). The comment below is this workflow's own output; in-place upsert verified across pushes.
  • Production-profile A/A on the dedicated machines (identical code both sides): 0 false positives across 416 rows after the noise-model refinement (7 before it). A/A dispatch mode verified end-to-end.
  • Wall clocks: Linux ≈ 59 min, macOS ≈ 32 min, Windows ≈ 22 min.
  • The gate went through a dedicated adversarial security review; its findings (label-replay hardening, fail-closed label consume, env-routed event data, trusted tooling checkout) are in the final artifact.

Reviewer notes

  • The spec's pr dispatch input was deliberately dropped — a manual dispatch reports to the workflow step summary only; giving dispatch the power to write comments to arbitrary PRs seemed wrong.
  • Because tooling runs from the base commit, a PR that only edits .github/bench/** exercises the base version of the tooling; tooling changes get their live test via branch dispatch or post-merge.
  • This PR's own branch no longer triggers the workflow (pull_request_target reads the base branch, which gains the workflow on merge). The comment below is from the final dress-rehearsal run at the pre-squash head; the code is unchanged since, only consolidated.

Post-merge follow-ups

@cppalliance-bot

cppalliance-bot commented Sep 29, 2026 •

Copy link
Copy Markdown

An automated preview of the documentation is available at https://374.corosio.prtest3.cppalliance.org/index.html

If more commits are pushed to the pull request, the docs will rebuild at the same URL.

2026-09-29 21:15:19 UTC

@cppalliance-bot

cppalliance-bot commented Sep 29, 2026 •

Copy link
Copy Markdown

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

Build time: 2026-09-30 14:42:15 UTC

@github-actions

github-actions Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Benchmark report

54e28fd40cf7 (base) vs c5cede230137 (head)

  • ✅ linux — clean (epoll, uring)
  • ✅ windows — clean (iocp)
  • ✅ macos — clean (kqueue)
linux — full results (226 benchmarks, 5 iterations, 1.5s each)

accept_churn

Benchmark Backend Metric Base Head Δ Noise
burst/10 epoll ops_per_sec 1.82K ops/s 1.82K ops/s 🟢▲ +0.25% 0.46%
burst/10 uring ops_per_sec 1.62K ops/s 1.62K ops/s 🟢▲ +0.21% 0.35%
burst/100 epoll ops_per_sec 181.2 ops/s 181.6 ops/s 🟢▲ +0.09% 0.31%
burst/100 uring ops_per_sec 165.1 ops/s 165.1 ops/s ⚪ 0.00% 0.23%
burst_lockless/10 epoll ops_per_sec 1.83K ops/s 1.84K ops/s 🟢▲ +0.08% 0.21%
burst_lockless/10 uring ops_per_sec 1.73K ops/s 1.73K ops/s 🔴▼ -0.32% 0.41%
burst_lockless/100 epoll ops_per_sec 182.8 ops/s 182.9 ops/s ⚪ 0.00% 0.31%
burst_lockless/100 uring ops_per_sec 175.7 ops/s 175.0 ops/s 🔴▼ -0.75% 0.65%
concurrent/1 epoll ops_per_sec 14.93K ops/s 14.92K ops/s 🔴▼ -0.32% 0.37%
concurrent/1 uring ops_per_sec 11.59K ops/s 11.58K ops/s 🔴▼ -0.17% 0.52%
concurrent/16 epoll ops_per_sec 14.91K ops/s 14.91K ops/s 🔴▼ -0.04% 0.33%
concurrent/16 uring ops_per_sec 11.41K ops/s 11.42K ops/s 🔴▼ -0.18% 0.58%
concurrent/4 epoll ops_per_sec 14.94K ops/s 14.95K ops/s 🟢▲ +0.26% 0.39%
concurrent/4 uring ops_per_sec 11.54K ops/s 11.56K ops/s 🟢▲ +0.21% 0.56%
sequential epoll ops_per_sec 14.89K ops/s 14.90K ops/s ⚪ 0.00% 0.45%
sequential uring ops_per_sec 11.63K ops/s 11.62K ops/s 🔴▼ -0.03% 0.48%
sequential_lockless epoll ops_per_sec 15.00K ops/s 14.99K ops/s 🔴▼ -0.33% 0.47%
sequential_lockless uring ops_per_sec 12.35K ops/s 12.35K ops/s 🟢▲ +0.13% 0.42%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 epoll ops_per_sec 3.70K ops/s 3.69K ops/s 🔴▼ -0.19% 0.26%
concurrent_parents/1 uring ops_per_sec 3.49K ops/s 3.49K ops/s 🟢▲ +0.11% 0.33%
concurrent_parents/16 epoll ops_per_sec 3.52K ops/s 3.52K ops/s 🔴▼ -0.10% 0.16%
concurrent_parents/16 uring ops_per_sec 3.31K ops/s 3.32K ops/s 🟢▲ +0.14% 0.16%
concurrent_parents/4 epoll ops_per_sec 3.54K ops/s 3.54K ops/s 🟢▲ +0.07% 0.22%
concurrent_parents/4 uring ops_per_sec 3.34K ops/s 3.34K ops/s 🟢▲ +0.07% 0.16%
concurrent_parents_lockless/1 epoll ops_per_sec 3.74K ops/s 3.74K ops/s 🔴▼ -0.09% 0.20%
concurrent_parents_lockless/1 uring ops_per_sec 3.72K ops/s 3.72K ops/s 🔴▼ -0.08% 0.26%
concurrent_parents_lockless/16 epoll ops_per_sec 3.56K ops/s 3.55K ops/s 🔴▼ -0.09% 0.10%
concurrent_parents_lockless/16 uring ops_per_sec 3.53K ops/s 3.53K ops/s 🟢▲ +0.14% 0.17%
concurrent_parents_lockless/4 epoll ops_per_sec 3.57K ops/s 3.57K ops/s 🔴▼ -0.22% 0.22%
concurrent_parents_lockless/4 uring ops_per_sec 3.56K ops/s 3.56K ops/s 🟢▲ +0.08% 0.34%
fork_join/1 epoll ops_per_sec 54.75K ops/s 54.69K ops/s 🔴▼ -0.13% 0.20%
fork_join/1 uring ops_per_sec 53.88K ops/s 53.68K ops/s 🔴▼ -0.41% 0.32%
fork_join/16 epoll ops_per_sec 3.70K ops/s 3.70K ops/s 🔴▼ -0.09% 0.17%
fork_join/16 uring ops_per_sec 3.49K ops/s 3.48K ops/s 🔴▼ -0.10% 0.18%
fork_join/4 epoll ops_per_sec 14.65K ops/s 14.65K ops/s 🟢▲ +0.05% 0.14%
fork_join/4 uring ops_per_sec 13.91K ops/s 13.87K ops/s 🔴▼ -0.13% 0.38%
fork_join/64 epoll ops_per_sec 884.6 ops/s 885.7 ops/s 🟢▲ +0.22% 0.19%
fork_join/64 uring ops_per_sec 815.6 ops/s 816.3 ops/s 🟢▲ +0.04% 0.19%
fork_join_lockless/1 epoll ops_per_sec 55.62K ops/s 55.58K ops/s 🔴▼ -0.07% 0.21%
fork_join_lockless/1 uring ops_per_sec 57.08K ops/s 56.88K ops/s 🔴▼ -0.50% 0.49%
fork_join_lockless/16 epoll ops_per_sec 3.74K ops/s 3.74K ops/s ⚪ 0.00% 0.21%
fork_join_lockless/16 uring ops_per_sec 3.73K ops/s 3.73K ops/s 🔴▼ -0.20% 0.25%
fork_join_lockless/4 epoll ops_per_sec 14.84K ops/s 14.83K ops/s 🔴▼ -0.07% 0.13%
fork_join_lockless/4 uring ops_per_sec 14.80K ops/s 14.75K ops/s 🔴▼ -0.11% 0.32%
fork_join_lockless/64 epoll ops_per_sec 894.8 ops/s 894.3 ops/s 🔴▼ -0.06% 0.19%
fork_join_lockless/64 uring ops_per_sec 872.1 ops/s 872.8 ops/s 🟢▲ +0.11% 0.25%
nested/16 epoll ops_per_sec 879.6 ops/s 881.3 ops/s 🟢▲ +0.28% 0.17%
nested/16 uring ops_per_sec 806.3 ops/s 807.5 ops/s 🟢▲ +0.14% 0.19%
nested/4 epoll ops_per_sec 3.68K ops/s 3.67K ops/s 🔴▼ -0.40% 0.22%
nested/4 uring ops_per_sec 3.45K ops/s 3.45K ops/s 🟢▲ +0.02% 0.24%
nested_lockless/16 epoll ops_per_sec 889.0 ops/s 889.5 ops/s 🟢▲ +0.14% 0.24%
nested_lockless/16 uring ops_per_sec 862.8 ops/s 862.5 ops/s 🔴▼ -0.09% 0.26%
nested_lockless/4 epoll ops_per_sec 3.72K ops/s 3.72K ops/s 🔴▼ -0.25% 0.17%
nested_lockless/4 uring ops_per_sec 3.70K ops/s 3.69K ops/s 🔴▼ -0.37% 0.14%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll ops_per_sec 54.07K ops/s 53.87K ops/s 🔴▼ -0.56% 0.39%
concurrent/1 uring ops_per_sec 53.82K ops/s 53.62K ops/s 🔴▼ -0.72% 0.36%
concurrent/16 epoll ops_per_sec 57.54K ops/s 57.40K ops/s 🔴▼ -0.04% 0.30%
concurrent/16 uring ops_per_sec 53.14K ops/s 52.95K ops/s 🔴▼ -0.29% 0.39%
concurrent/32 epoll ops_per_sec 56.79K ops/s 56.72K ops/s 🔴▼ -0.26% 0.31%
concurrent/32 uring ops_per_sec 52.44K ops/s 52.34K ops/s 🟢▲ +0.04% 0.40%
concurrent/4 epoll ops_per_sec 56.48K ops/s 56.27K ops/s 🔴▼ -0.10% 0.59%
concurrent/4 uring ops_per_sec 53.24K ops/s 53.19K ops/s 🟢▲ +0.08% 0.44%
multithread/1 epoll ops_per_sec 56.74K ops/s 56.70K ops/s 🔴▼ -0.05% 0.30%
multithread/1 uring ops_per_sec 52.43K ops/s 52.32K ops/s 🔴▼ -0.25% 0.42%
multithread/16 epoll ops_per_sec 113.5K ops/s 113.3K ops/s 🟢▲ +0.24% 0.94%
multithread/16 uring ops_per_sec 74.46K ops/s 74.61K ops/s 🟢▲ +0.26% 19.50%
multithread/2 epoll ops_per_sec 84.13K ops/s 83.98K ops/s 🟢▲ +0.03% 0.43%
multithread/2 uring ops_per_sec 87.70K ops/s 87.46K ops/s 🔴▼ -0.60% 1.64%
multithread/4 epoll ops_per_sec 149.9K ops/s 151.3K ops/s 🔴▼ -0.13% 2.47%
multithread/4 uring ops_per_sec 81.79K ops/s 81.75K ops/s 🟢▲ +0.33% 0.82%
multithread/8 epoll ops_per_sec 128.6K ops/s 127.7K ops/s 🔴▼ -0.87% 0.45%
multithread/8 uring ops_per_sec 80.11K ops/s 80.06K ops/s 🔴▼ -0.05% 0.43%
single_conn epoll ops_per_sec 54.11K ops/s 53.98K ops/s 🔴▼ -0.29% 0.32%
single_conn uring ops_per_sec 53.78K ops/s 53.59K ops/s 🔴▼ -0.70% 0.56%
single_conn_lockless epoll ops_per_sec 54.82K ops/s 54.60K ops/s 🔴▼ -0.60% 0.33%
single_conn_lockless uring ops_per_sec 56.57K ops/s 56.41K ops/s 🔴▼ -0.28% 0.54%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 8.14 µs 7.93 µs 🟢▲ +0.55% 5.48%
concurrent/1 uring latency_mean_ns 7.53 µs 7.20 µs 🟢▲ +0.53% 5.78%
concurrent/16 epoll latency_mean_ns 121.94 µs 121.71 µs 🟢▲ +0.14% 0.14%
concurrent/16 uring latency_mean_ns 119.33 µs 119.16 µs 🟢▲ +0.10% 0.40%
concurrent/4 epoll latency_mean_ns 30.79 µs 30.52 µs 🟢▲ +0.32% 1.57%
concurrent/4 uring latency_mean_ns 29.77 µs 29.74 µs 🟢▲ +0.05% 1.48%
concurrent_lockless/1 epoll latency_mean_ns 8.03 µs 7.83 µs 🟢▲ +0.45% 5.66%
concurrent_lockless/1 uring latency_mean_ns 7.37 µs 7.34 µs 🟢▲ +0.03% 4.89%
concurrent_lockless/16 epoll latency_mean_ns 120.72 µs 120.18 µs 🟢▲ +0.36% 0.14%
concurrent_lockless/16 uring latency_mean_ns 118.95 µs 118.99 µs 🔴▼ -0.06% 0.34%
concurrent_lockless/4 epoll latency_mean_ns 30.30 µs 30.52 µs 🟢▲ +0.10% 1.55%
concurrent_lockless/4 uring latency_mean_ns 29.58 µs 29.47 µs 🟢▲ +0.35% 1.55%
pingpong/1 epoll latency_mean_ns 7.94 µs 7.74 µs 🟢▲ +0.56% 4.57%
pingpong/1 uring latency_mean_ns 7.48 µs 7.33 µs 🔴▼ -0.06% 5.75%
pingpong/1024 epoll latency_mean_ns 8.70 µs 8.49 µs 🟢▲ +0.69% 5.24%
pingpong/1024 uring latency_mean_ns 7.93 µs 8.09 µs 🔴▼ -0.52% 5.73%
pingpong/64 epoll latency_mean_ns 8.14 µs 8.27 µs 🟢▲ +0.41% 5.62%
pingpong/64 uring latency_mean_ns 7.37 µs 7.36 µs 🟢▲ +0.25% 5.04%
pingpong_lockless/1 epoll latency_mean_ns 7.65 µs 7.79 µs 🟢▲ +0.36% 4.88%
pingpong_lockless/1 uring latency_mean_ns 7.32 µs 7.31 µs 🟢▲ +0.10% 5.27%
pingpong_lockless/1024 epoll latency_mean_ns 8.41 µs 8.22 µs 🟢▲ +0.48% 5.45%
pingpong_lockless/1024 uring latency_mean_ns 7.91 µs 7.91 µs 🟢▲ +0.27% 5.82%
pingpong_lockless/64 epoll latency_mean_ns 8.02 µs 7.83 µs 🟢▲ +0.41% 5.78%
pingpong_lockless/64 uring latency_mean_ns 7.20 µs 7.52 µs 🔴▼ -0.16% 5.81%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 274.6 MB/s 274.2 MB/s 🔴▼ -0.08% 0.26%
bidirectional/1024 uring bytes_per_sec 268.7 MB/s 270.0 MB/s 🟢▲ +0.42% 0.81%
bidirectional/1048576 epoll bytes_per_sec 2.94 GB/s 2.91 GB/s ⚪ 0.00% 3.62%
bidirectional/1048576 uring bytes_per_sec 3.13 GB/s 3.09 GB/s 🔴▼ -1.76% 2.58%
bidirectional/16384 epoll bytes_per_sec 2.76 GB/s 2.78 GB/s 🟢▲ +1.25% 2.36%
bidirectional/16384 uring bytes_per_sec 2.21 GB/s 2.23 GB/s 🟢▲ +0.53% 1.10%
bidirectional/262144 epoll bytes_per_sec 2.91 GB/s 2.93 GB/s 🔴▼ -1.36% 3.88%
bidirectional/262144 uring bytes_per_sec 3.10 GB/s 3.12 GB/s 🟢▲ +0.54% 1.90%
bidirectional/4096 epoll bytes_per_sec 899.8 MB/s 898.9 MB/s 🔴▼ -0.17% 1.02%
bidirectional/4096 uring bytes_per_sec 885.4 MB/s 882.9 MB/s 🔴▼ -0.39% 0.75%
bidirectional/65536 epoll bytes_per_sec 2.67 GB/s 2.65 GB/s 🔴▼ -1.41% 1.71%
bidirectional/65536 uring bytes_per_sec 2.75 GB/s 2.77 GB/s 🔴▼ -0.24% 1.44%
bidirectional_lockless/1024 epoll bytes_per_sec 279.9 MB/s 277.1 MB/s 🔴▼ -0.75% 1.07%
bidirectional_lockless/1024 uring bytes_per_sec 268.9 MB/s 270.0 MB/s 🟢▲ +0.60% 0.74%
bidirectional_lockless/1048576 epoll bytes_per_sec 2.97 GB/s 2.89 GB/s 🔴▼ -2.90% 3.31%
bidirectional_lockless/1048576 uring bytes_per_sec 3.21 GB/s 3.18 GB/s 🔴▼ -0.81% 2.82%
bidirectional_lockless/16384 epoll bytes_per_sec 2.80 GB/s 2.81 GB/s 🟢▲ +1.82% 2.27%
bidirectional_lockless/16384 uring bytes_per_sec 2.43 GB/s 2.43 GB/s 🔴▼ -0.06% 1.17%
bidirectional_lockless/262144 epoll bytes_per_sec 2.94 GB/s 2.93 GB/s 🔴▼ -1.51% 3.97%
bidirectional_lockless/262144 uring bytes_per_sec 3.21 GB/s 3.23 GB/s 🟢▲ +0.88% 2.50%
bidirectional_lockless/4096 epoll bytes_per_sec 906.5 MB/s 906.0 MB/s 🟢▲ +0.30% 0.85%
bidirectional_lockless/4096 uring bytes_per_sec 882.9 MB/s 888.8 MB/s 🟢▲ +0.85% 0.80%
bidirectional_lockless/65536 epoll bytes_per_sec 2.69 GB/s 2.65 GB/s 🔴▼ -0.51% 1.78%
bidirectional_lockless/65536 uring bytes_per_sec 3.00 GB/s 3.03 GB/s 🟢▲ +0.66% 1.40%
unidirectional/1024 epoll bytes_per_sec 267.6 MB/s 267.6 MB/s 🟢▲ +0.08% 0.50%
unidirectional/1024 uring bytes_per_sec 268.4 MB/s 268.3 MB/s 🔴▼ -0.27% 0.76%
unidirectional/1048576 epoll bytes_per_sec 3.12 GB/s 3.09 GB/s 🔴▼ -0.52% 2.36%
unidirectional/1048576 uring bytes_per_sec 3.23 GB/s 3.17 GB/s 🔴▼ -0.55% 4.01%
unidirectional/16384 epoll bytes_per_sec 2.74 GB/s 2.80 GB/s 🟢▲ +2.82% 2.29%
unidirectional/16384 uring bytes_per_sec 2.44 GB/s 2.47 GB/s 🟢▲ +1.70% 1.73%
unidirectional/262144 epoll bytes_per_sec 3.08 GB/s 3.13 GB/s 🟢▲ +0.01% 4.15%
unidirectional/262144 uring bytes_per_sec 3.21 GB/s 3.17 GB/s ⚪ 0.00% 3.77%
unidirectional/4096 epoll bytes_per_sec 882.3 MB/s 881.2 MB/s 🔴▼ -0.44% 1.17%
unidirectional/4096 uring bytes_per_sec 884.8 MB/s 886.3 MB/s 🟢▲ +0.21% 0.84%
unidirectional/65536 epoll bytes_per_sec 3.03 GB/s 3.02 GB/s 🔴▼ -0.94% 3.05%
unidirectional/65536 uring bytes_per_sec 3.06 GB/s 3.06 GB/s 🟢▲ +0.67% 2.72%
unidirectional_lockless/1024 epoll bytes_per_sec 271.7 MB/s 270.6 MB/s 🔴▼ -0.03% 0.88%
unidirectional_lockless/1024 uring bytes_per_sec 271.7 MB/s 270.7 MB/s 🔴▼ -0.18% 0.49%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.14 GB/s 3.09 GB/s 🔴▼ -2.82% 1.85%
unidirectional_lockless/1048576 uring bytes_per_sec 3.21 GB/s 3.14 GB/s 🔴▼ -2.07% 4.39%
unidirectional_lockless/16384 epoll bytes_per_sec 2.77 GB/s 2.82 GB/s 🟢▲ +1.20% 2.59%
unidirectional_lockless/16384 uring bytes_per_sec 2.48 GB/s 2.47 GB/s 🔴▼ -0.45% 1.67%
unidirectional_lockless/262144 epoll bytes_per_sec 3.10 GB/s 3.16 GB/s 🟢▲ +0.41% 4.11%
unidirectional_lockless/262144 uring bytes_per_sec 3.20 GB/s 3.15 GB/s 🟢▲ +0.86% 3.22%
unidirectional_lockless/4096 epoll bytes_per_sec 885.0 MB/s 886.6 MB/s 🟢▲ +0.22% 0.55%
unidirectional_lockless/4096 uring bytes_per_sec 894.6 MB/s 888.7 MB/s 🔴▼ -0.93% 0.81%
unidirectional_lockless/65536 epoll bytes_per_sec 3.03 GB/s 3.04 GB/s 🟢▲ +2.88% 3.04%
unidirectional_lockless/65536 uring bytes_per_sec 3.11 GB/s 3.05 GB/s 🔴▼ -2.28% 2.75%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 14.72 µs 14.71 µs 🔴▼ -0.11% 0.32%
concurrent/1 uring latency_mean_ns 14.37 µs 14.33 µs 🟢▲ +0.19% 0.23%
concurrent/16 epoll latency_mean_ns 231.49 µs 231.52 µs 🔴▼ -0.01% 0.19%
concurrent/16 uring latency_mean_ns 232.68 µs 232.37 µs ⚪ 0.00% 0.31%
concurrent/4 epoll latency_mean_ns 57.87 µs 57.81 µs 🟢▲ +0.10% 0.15%
concurrent/4 uring latency_mean_ns 57.79 µs 57.68 µs 🟢▲ +0.17% 0.24%
concurrent_lockless/1 epoll latency_mean_ns 14.59 µs 14.61 µs 🔴▼ -0.23% 0.28%
concurrent_lockless/1 uring latency_mean_ns 14.35 µs 14.35 µs 🔴▼ -0.05% 0.33%
concurrent_lockless/16 epoll latency_mean_ns 230.26 µs 230.01 µs 🟢▲ +0.02% 0.17%
concurrent_lockless/16 uring latency_mean_ns 232.28 µs 232.13 µs 🟢▲ +0.02% 0.35%
concurrent_lockless/4 epoll latency_mean_ns 57.47 µs 57.43 µs 🔴▼ -0.02% 0.21%
concurrent_lockless/4 uring latency_mean_ns 57.66 µs 57.58 µs 🟢▲ +0.12% 0.29%
pingpong/1 epoll latency_mean_ns 14.64 µs 14.63 µs 🟢▲ +0.06% 0.23%
pingpong/1 uring latency_mean_ns 14.30 µs 14.27 µs 🟢▲ +0.18% 0.38%
pingpong/1024 epoll latency_mean_ns 14.94 µs 14.93 µs 🟢▲ +0.01% 0.28%
pingpong/1024 uring latency_mean_ns 14.55 µs 14.53 µs 🟢▲ +0.12% 0.32%
pingpong/64 epoll latency_mean_ns 14.70 µs 14.70 µs 🔴▼ -0.04% 0.18%
pingpong/64 uring latency_mean_ns 14.36 µs 14.34 µs 🟢▲ +0.21% 0.33%
pingpong_lockless/1 epoll latency_mean_ns 14.50 µs 14.50 µs 🔴▼ -0.12% 0.17%
pingpong_lockless/1 uring latency_mean_ns 14.26 µs 14.25 µs 🟢▲ +0.07% 0.20%
pingpong_lockless/1024 epoll latency_mean_ns 14.81 µs 14.79 µs 🟢▲ +0.11% 0.30%
pingpong_lockless/1024 uring latency_mean_ns 14.53 µs 14.51 µs 🟢▲ +0.04% 0.25%
pingpong_lockless/64 epoll latency_mean_ns 14.59 µs 14.59 µs 🟢▲ +0.04% 0.13%
pingpong_lockless/64 uring latency_mean_ns 14.34 µs 14.33 µs 🟢▲ +0.09% 0.18%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 137.2 MB/s 137.0 MB/s 🔴▼ -0.20% 0.34%
bidirectional/1024 uring bytes_per_sec 144.1 MB/s 144.0 MB/s 🔴▼ -0.01% 0.42%
bidirectional/1048576 epoll bytes_per_sec 3.10 GB/s 3.14 GB/s 🟢▲ +0.83% 1.08%
bidirectional/1048576 uring bytes_per_sec 3.11 GB/s 3.09 GB/s 🔴▼ -0.76% 1.25%
bidirectional/16384 epoll bytes_per_sec 1.66 GB/s 1.66 GB/s 🔴▼ -0.08% 1.37%
bidirectional/16384 uring bytes_per_sec 1.61 GB/s 1.60 GB/s 🔴▼ -0.07% 0.72%
bidirectional/262144 epoll bytes_per_sec 2.97 GB/s 3.02 GB/s 🟢▲ +1.68% 1.29%
bidirectional/262144 uring bytes_per_sec 3.01 GB/s 3.01 GB/s 🟢▲ +0.18% 1.21%
bidirectional/4096 epoll bytes_per_sec 515.0 MB/s 515.0 MB/s 🔴▼ -0.07% 0.17%
bidirectional/4096 uring bytes_per_sec 515.0 MB/s 515.2 MB/s 🔴▼ -0.24% 0.60%
bidirectional/65536 epoll bytes_per_sec 2.54 GB/s 2.54 GB/s 🔴▼ -0.01% 0.88%
bidirectional/65536 uring bytes_per_sec 2.52 GB/s 2.52 GB/s 🔴▼ -0.24% 0.82%
bidirectional_lockless/1024 epoll bytes_per_sec 137.6 MB/s 137.6 MB/s 🟢▲ +0.09% 0.60%
bidirectional_lockless/1024 uring bytes_per_sec 143.8 MB/s 144.1 MB/s 🟢▲ +0.26% 0.40%
bidirectional_lockless/1048576 epoll bytes_per_sec 3.10 GB/s 3.14 GB/s 🟢▲ +1.25% 1.01%
bidirectional_lockless/1048576 uring bytes_per_sec 3.19 GB/s 3.19 GB/s 🟢▲ +0.14% 1.34%
bidirectional_lockless/16384 epoll bytes_per_sec 1.68 GB/s 1.67 GB/s 🔴▼ -0.18% 1.20%
bidirectional_lockless/16384 uring bytes_per_sec 1.62 GB/s 1.61 GB/s 🔴▼ -0.87% 0.65%
bidirectional_lockless/262144 epoll bytes_per_sec 2.98 GB/s 3.03 GB/s 🟢▲ +2.28% 1.71%
bidirectional_lockless/262144 uring bytes_per_sec 3.02 GB/s 3.02 GB/s 🔴▼ -0.53% 1.51%
bidirectional_lockless/4096 epoll bytes_per_sec 518.4 MB/s 516.6 MB/s 🔴▼ -0.11% 0.39%
bidirectional_lockless/4096 uring bytes_per_sec 515.9 MB/s 517.2 MB/s 🟢▲ +0.60% 0.35%
bidirectional_lockless/65536 epoll bytes_per_sec 2.54 GB/s 2.57 GB/s 🟢▲ +0.71% 1.16%
bidirectional_lockless/65536 uring bytes_per_sec 2.51 GB/s 2.52 GB/s 🟢▲ +0.76% 0.91%
multithread/2 epoll bytes_per_sec 3.15 GB/s 3.16 GB/s 🔴▼ -0.62% 3.06%
multithread/2 uring bytes_per_sec 3.11 GB/s 3.12 GB/s 🟢▲ +0.22% 1.78%
multithread/4 epoll bytes_per_sec 4.89 GB/s 4.91 GB/s 🟢▲ +0.21% 0.67%
multithread/4 uring bytes_per_sec 4.95 GB/s 4.95 GB/s 🟢▲ +0.18% 0.56%
multithread/8 epoll bytes_per_sec 5.11 GB/s 5.12 GB/s 🟢▲ +0.31% 0.72%
multithread/8 uring bytes_per_sec 5.23 GB/s 5.21 GB/s 🔴▼ -0.20% 0.54%
unidirectional/1024 epoll bytes_per_sec 129.0 MB/s 129.4 MB/s 🟢▲ +0.07% 0.81%
unidirectional/1024 uring bytes_per_sec 142.5 MB/s 142.5 MB/s ⚪ 0.00% 0.35%
unidirectional/1048576 epoll bytes_per_sec 3.22 GB/s 3.22 GB/s 🟢▲ +0.05% 0.51%
unidirectional/1048576 uring bytes_per_sec 3.26 GB/s 3.24 GB/s 🔴▼ -0.25% 0.85%
unidirectional/16384 epoll bytes_per_sec 1.60 GB/s 1.59 GB/s 🟢▲ +0.13% 1.34%
unidirectional/16384 uring bytes_per_sec 1.61 GB/s 1.61 GB/s 🔴▼ -0.14% 0.82%
unidirectional/262144 epoll bytes_per_sec 3.02 GB/s 3.03 GB/s 🟢▲ +0.40% 0.90%
unidirectional/262144 uring bytes_per_sec 3.06 GB/s 3.03 GB/s 🔴▼ -1.14% 1.83%
unidirectional/4096 epoll bytes_per_sec 483.8 MB/s 483.6 MB/s 🟢▲ +0.08% 0.36%
unidirectional/4096 uring bytes_per_sec 509.1 MB/s 508.6 MB/s 🔴▼ -0.65% 0.61%
unidirectional/65536 epoll bytes_per_sec 2.52 GB/s 2.52 GB/s 🔴▼ -0.17% 1.49%
unidirectional/65536 uring bytes_per_sec 2.53 GB/s 2.50 GB/s 🔴▼ -0.82% 1.21%
unidirectional_lockless/1024 epoll bytes_per_sec 129.6 MB/s 129.8 MB/s 🔴▼ -0.03% 0.94%
unidirectional_lockless/1024 uring bytes_per_sec 142.9 MB/s 142.6 MB/s 🔴▼ -0.18% 0.32%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.14 GB/s 3.19 GB/s 🟢▲ +1.56% 0.89%
unidirectional_lockless/1048576 uring bytes_per_sec 3.21 GB/s 3.20 GB/s 🔴▼ -0.12% 1.19%
unidirectional_lockless/16384 epoll bytes_per_sec 1.60 GB/s 1.59 GB/s 🔴▼ -0.94% 2.12%
unidirectional_lockless/16384 uring bytes_per_sec 1.61 GB/s 1.60 GB/s 🔴▼ -0.91% 1.19%
unidirectional_lockless/262144 epoll bytes_per_sec 2.96 GB/s 3.01 GB/s 🟢▲ +1.59% 1.21%
unidirectional_lockless/262144 uring bytes_per_sec 3.05 GB/s 3.04 GB/s 🔴▼ -0.50% 1.17%
unidirectional_lockless/4096 epoll bytes_per_sec 485.4 MB/s 484.2 MB/s 🟢▲ +0.03% 0.72%
unidirectional_lockless/4096 uring bytes_per_sec 511.1 MB/s 512.5 MB/s 🟢▲ +0.19% 0.25%
unidirectional_lockless/65536 epoll bytes_per_sec 2.50 GB/s 2.55 GB/s 🟢▲ +1.70% 0.65%
unidirectional_lockless/65536 uring bytes_per_sec 2.52 GB/s 2.50 GB/s 🔴▼ -0.99% 1.12%
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.44% 0.37%
burst/100 iocp ops_per_sec 154.0 ops/s 153.1 ops/s 🔴▼ -0.37% 0.88%
burst_lockless/10 iocp ops_per_sec 1.57K ops/s 1.57K ops/s 🟢▲ +0.26% 0.28%
burst_lockless/100 iocp ops_per_sec 156.8 ops/s 156.4 ops/s 🟢▲ +0.16% 0.92%
concurrent/1 iocp ops_per_sec 12.50K ops/s 12.56K ops/s 🔴▼ -0.16% 1.47%
concurrent/16 iocp ops_per_sec 13.38K ops/s 13.36K ops/s 🔴▼ -0.13% 0.48%
concurrent/4 iocp ops_per_sec 13.14K ops/s 13.11K ops/s 🔴▼ -0.33% 0.42%
sequential iocp ops_per_sec 12.52K ops/s 12.56K ops/s 🟢▲ +0.05% 0.51%
sequential_lockless iocp ops_per_sec 12.58K ops/s 12.59K ops/s 🔴▼ -0.01% 0.27%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 iocp ops_per_sec 7.18K ops/s 7.16K ops/s 🔴▼ -0.10% 0.31%
concurrent_parents/16 iocp ops_per_sec 6.46K ops/s 6.46K ops/s 🔴▼ -0.15% 1.28%
concurrent_parents/4 iocp ops_per_sec 6.89K ops/s 6.93K ops/s 🟢▲ +0.32% 0.77%
concurrent_parents_lockless/1 iocp ops_per_sec 7.17K ops/s 7.18K ops/s 🟢▲ +0.14% 0.19%
concurrent_parents_lockless/16 iocp ops_per_sec 6.47K ops/s 6.49K ops/s 🔴▼ -0.05% 1.34%
concurrent_parents_lockless/4 iocp ops_per_sec 6.92K ops/s 6.94K ops/s 🟢▲ +0.19% 0.62%
fork_join/1 iocp ops_per_sec 112.2K ops/s 112.7K ops/s 🟢▲ +0.32% 0.33%
fork_join/16 iocp ops_per_sec 7.16K ops/s 7.16K ops/s 🟢▲ +0.01% 0.22%
fork_join/4 iocp ops_per_sec 29.15K ops/s 29.22K ops/s 🟢▲ +0.29% 0.32%
fork_join/64 iocp ops_per_sec 1.72K ops/s 1.73K ops/s 🟢▲ +0.14% 1.87%
fork_join_lockless/1 iocp ops_per_sec 111.6K ops/s 112.6K ops/s 🟢▲ +0.90% 0.45%
fork_join_lockless/16 iocp ops_per_sec 7.19K ops/s 7.16K ops/s 🔴▼ -0.39% 0.25%
fork_join_lockless/4 iocp ops_per_sec 29.19K ops/s 29.16K ops/s 🟢▲ +0.06% 0.28%
fork_join_lockless/64 iocp ops_per_sec 1.73K ops/s 1.73K ops/s 🟢▲ +0.46% 0.87%
nested/16 iocp ops_per_sec 1.69K ops/s 1.70K ops/s 🟢▲ +0.17% 0.69%
nested/4 iocp ops_per_sec 7.02K ops/s 7.01K ops/s 🔴▼ -0.19% 0.41%
nested_lockless/16 iocp ops_per_sec 1.69K ops/s 1.70K ops/s 🟢▲ +0.49% 0.88%
nested_lockless/4 iocp ops_per_sec 7.02K ops/s 7.01K ops/s 🔴▼ -0.19% 0.24%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp ops_per_sec 111.3K ops/s 110.9K ops/s 🔴▼ -0.30% 0.26%
concurrent/16 iocp ops_per_sec 108.5K ops/s 108.1K ops/s 🔴▼ -0.28% 0.30%
concurrent/32 iocp ops_per_sec 107.6K ops/s 107.5K ops/s 🔴▼ -0.18% 0.23%
concurrent/4 iocp ops_per_sec 109.1K ops/s 108.9K ops/s 🔴▼ -0.21% 0.34%
multithread/1 iocp ops_per_sec 107.6K ops/s 107.3K ops/s 🔴▼ -0.30% 0.29%
multithread/16 iocp ops_per_sec 268.9K ops/s 268.3K ops/s 🔴▼ -0.01% 0.53%
multithread/2 iocp ops_per_sec 181.0K ops/s 181.3K ops/s 🟢▲ +0.02% 0.60%
multithread/4 iocp ops_per_sec 226.8K ops/s 226.9K ops/s 🟢▲ +0.01% 0.46%
multithread/8 iocp ops_per_sec 268.4K ops/s 268.7K ops/s 🔴▼ -0.09% 0.48%
single_conn iocp ops_per_sec 110.9K ops/s 110.8K ops/s 🔴▼ -0.40% 0.54%
single_conn_lockless iocp ops_per_sec 111.2K ops/s 110.7K ops/s 🔴▼ -0.46% 0.38%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp latency_mean_ns 7.61 µs 7.60 µs 🟢▲ +0.24% 0.38%
concurrent/16 iocp latency_mean_ns 129.28 µs 128.43 µs 🟢▲ +1.55% 3.74%
concurrent/4 iocp latency_mean_ns 30.47 µs 30.48 µs 🔴▼ -0.15% 0.54%
concurrent_lockless/1 iocp latency_mean_ns 7.61 µs 7.62 µs 🟢▲ +0.06% 0.34%
concurrent_lockless/16 iocp latency_mean_ns 121.95 µs 123.79 µs 🔴▼ -0.09% 3.53%
concurrent_lockless/4 iocp latency_mean_ns 30.44 µs 30.39 µs 🟢▲ +0.07% 0.48%
pingpong/1 iocp latency_mean_ns 7.61 µs 7.59 µs 🟢▲ +0.34% 0.41%
pingpong/1024 iocp latency_mean_ns 7.72 µs 7.69 µs 🟢▲ +0.35% 0.22%
pingpong/64 iocp latency_mean_ns 7.58 µs 7.60 µs 🔴▼ -0.07% 0.65%
pingpong_lockless/1 iocp latency_mean_ns 7.56 µs 7.58 µs 🔴▼ -0.18% 0.41%
pingpong_lockless/1024 iocp latency_mean_ns 7.71 µs 7.73 µs 🔴▼ -0.31% 0.33%
pingpong_lockless/64 iocp latency_mean_ns 7.61 µs 7.59 µs 🟢▲ +0.33% 0.32%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 iocp bytes_per_sec 278.4 MB/s 280.6 MB/s 🟢▲ +0.72% 0.45%
bidirectional/1048576 iocp bytes_per_sec 5.74 GB/s 5.23 GB/s 🔴▼ -5.39% 10.88%
bidirectional/16384 iocp bytes_per_sec 3.73 GB/s 3.75 GB/s 🟢▲ +0.44% 0.85%
bidirectional/262144 iocp bytes_per_sec 9.65 GB/s 9.63 GB/s 🔴▼ -0.09% 0.60%
bidirectional/4096 iocp bytes_per_sec 1.07 GB/s 1.08 GB/s 🟢▲ +0.68% 0.47%
bidirectional/65536 iocp bytes_per_sec 9.07 GB/s 9.10 GB/s 🟢▲ +0.64% 0.86%
bidirectional_lockless/1024 iocp bytes_per_sec 279.4 MB/s 279.9 MB/s 🟢▲ +0.30% 0.46%
bidirectional_lockless/1048576 iocp bytes_per_sec 5.90 GB/s 5.58 GB/s 🔴▼ -2.61% 7.95%
bidirectional_lockless/16384 iocp bytes_per_sec 3.74 GB/s 3.68 GB/s 🔴▼ -0.66% 3.10%
bidirectional_lockless/262144 iocp bytes_per_sec 9.73 GB/s 9.48 GB/s 🔴▼ -0.14% 7.48%
bidirectional_lockless/4096 iocp bytes_per_sec 1.07 GB/s 1.07 GB/s 🟢▲ +0.04% 0.88%
bidirectional_lockless/65536 iocp bytes_per_sec 9.05 GB/s 8.70 GB/s 🔴▼ -1.58% 8.35%
multithread/2 iocp bytes_per_sec 12.74 GB/s 12.70 GB/s 🔴▼ -0.21% 1.14%
multithread/4 iocp bytes_per_sec 17.04 GB/s 17.14 GB/s 🟢▲ +0.35% 0.93%
multithread/8 iocp bytes_per_sec 18.29 GB/s 18.33 GB/s 🔴▼ -0.13% 0.96%
unidirectional/1024 iocp bytes_per_sec 283.2 MB/s 283.9 MB/s 🟢▲ +0.21% 0.24%
unidirectional/1048576 iocp bytes_per_sec 4.49 GB/s 4.36 GB/s 🔴▼ -2.91% 5.61%
unidirectional/16384 iocp bytes_per_sec 3.77 GB/s 3.79 GB/s 🟢▲ +0.79% 1.15%
unidirectional/262144 iocp bytes_per_sec 8.89 GB/s 9.08 GB/s 🟢▲ +1.33% 4.53%
unidirectional/4096 iocp bytes_per_sec 1.08 GB/s 1.09 GB/s 🟢▲ +0.59% 0.43%
unidirectional/65536 iocp bytes_per_sec 9.12 GB/s 9.29 GB/s 🟢▲ +0.85% 3.07%
unidirectional_lockless/1024 iocp bytes_per_sec 283.8 MB/s 283.4 MB/s 🔴▼ -0.11% 0.60%
unidirectional_lockless/1048576 iocp bytes_per_sec 5.22 GB/s 4.82 GB/s 🔴▼ -9.55% 4.77%
unidirectional_lockless/16384 iocp bytes_per_sec 3.76 GB/s 3.79 GB/s 🟢▲ +0.62% 1.29%
unidirectional_lockless/262144 iocp bytes_per_sec 9.67 GB/s 9.71 GB/s 🟢▲ +0.40% 3.04%
unidirectional_lockless/4096 iocp bytes_per_sec 1.09 GB/s 1.09 GB/s 🟢▲ +0.24% 0.68%
unidirectional_lockless/65536 iocp bytes_per_sec 9.19 GB/s 9.27 GB/s 🟢▲ +0.09% 3.94%
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.18K ops/s 4.19K ops/s 🟢▲ +0.12% 0.70%
burst/100 kqueue ops_per_sec 437.4 ops/s 429.8 ops/s 🔴▼ -0.30% 2.37%
burst_lockless/10 kqueue ops_per_sec 4.23K ops/s 4.24K ops/s 🔴▼ -0.17% 0.60%
burst_lockless/100 kqueue ops_per_sec 432.0 ops/s 439.9 ops/s 🟢▲ +3.28% 2.20%
concurrent/1 kqueue ops_per_sec 19.44K ops/s 19.68K ops/s 🟢▲ +1.36% 1.00%
concurrent/16 kqueue ops_per_sec 34.60K ops/s 35.10K ops/s 🟢▲ +2.00% 1.81%
concurrent/4 kqueue ops_per_sec 29.02K ops/s 29.26K ops/s 🟢▲ +0.31% 0.81%
sequential kqueue ops_per_sec 19.93K ops/s 19.96K ops/s 🟢▲ +0.02% 0.22%
sequential_lockless kqueue ops_per_sec 19.51K ops/s 19.54K ops/s 🟢▲ +0.45% 1.15%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 kqueue ops_per_sec 7.70K ops/s 7.72K ops/s 🟢▲ +0.45% 0.73%
concurrent_parents/16 kqueue ops_per_sec 7.06K ops/s 7.62K ops/s 🟢▲ +1.00% 19.16%
concurrent_parents/4 kqueue ops_per_sec 8.19K ops/s 8.15K ops/s 🔴▼ -0.06% 1.77%
concurrent_parents_lockless/1 kqueue ops_per_sec 7.77K ops/s 7.75K ops/s 🔴▼ -0.44% 1.11%
concurrent_parents_lockless/16 kqueue ops_per_sec 7.17K ops/s 7.59K ops/s 🔴▼ -0.35% 19.00%
concurrent_parents_lockless/4 kqueue ops_per_sec 8.26K ops/s 8.21K ops/s 🟢▲ +0.33% 1.77%
fork_join/1 kqueue ops_per_sec 46.02K ops/s 45.91K ops/s 🔴▼ -0.64% 0.82%
fork_join/16 kqueue ops_per_sec 7.70K ops/s 7.71K ops/s 🟢▲ +0.27% 0.63%
fork_join/4 kqueue ops_per_sec 21.74K ops/s 21.80K ops/s 🟢▲ +0.01% 0.64%
fork_join/64 kqueue ops_per_sec 2.04K ops/s 2.02K ops/s 🔴▼ -0.07% 2.48%
fork_join_lockless/1 kqueue ops_per_sec 46.98K ops/s 47.03K ops/s 🔴▼ -0.05% 0.49%
fork_join_lockless/16 kqueue ops_per_sec 7.77K ops/s 7.76K ops/s 🔴▼ -0.02% 1.03%
fork_join_lockless/4 kqueue ops_per_sec 21.97K ops/s 22.02K ops/s 🔴▼ -0.11% 0.91%
fork_join_lockless/64 kqueue ops_per_sec 2.05K ops/s 2.04K ops/s 🟢▲ +0.08% 2.60%
nested/16 kqueue ops_per_sec 2.02K ops/s 2.01K ops/s 🟢▲ +0.39% 1.73%
nested/4 kqueue ops_per_sec 7.09K ops/s 7.10K ops/s 🟢▲ +0.23% 0.72%
nested_lockless/16 kqueue ops_per_sec 2.03K ops/s 2.02K ops/s 🔴▼ -0.09% 2.27%
nested_lockless/4 kqueue ops_per_sec 7.19K ops/s 7.20K ops/s 🟢▲ +0.09% 0.93%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue ops_per_sec 49.61K ops/s 49.56K ops/s 🔴▼ -0.24% 0.42%
concurrent/16 kqueue ops_per_sec 128.2K ops/s 128.8K ops/s 🟢▲ +0.61% 0.48%
concurrent/32 kqueue ops_per_sec 127.3K ops/s 127.9K ops/s 🟢▲ +0.74% 0.78%
concurrent/4 kqueue ops_per_sec 88.59K ops/s 88.85K ops/s 🟢▲ +0.30% 0.96%
multithread/1 kqueue ops_per_sec 127.4K ops/s 127.8K ops/s 🟢▲ +0.54% 0.84%
multithread/16 kqueue ops_per_sec 127.4K ops/s 127.8K ops/s 🟢▲ +0.16% 0.65%
multithread/2 kqueue ops_per_sec 179.4K ops/s 178.5K ops/s 🔴▼ -0.11% 1.74%
multithread/4 kqueue ops_per_sec 159.6K ops/s 160.2K ops/s 🟢▲ +0.71% 0.92%
multithread/8 kqueue ops_per_sec 131.4K ops/s 132.6K ops/s 🟢▲ +0.67% 1.78%
single_conn kqueue ops_per_sec 49.58K ops/s 49.58K ops/s 🔴▼ -0.05% 0.34%
single_conn_lockless kqueue ops_per_sec 49.79K ops/s 49.82K ops/s 🟢▲ +0.08% 0.43%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 2.06 µs 2.06 µs ⚪ 0.00% 0.33%
concurrent/16 kqueue latency_mean_ns 30.44 µs 30.48 µs 🔴▼ -0.25% 0.37%
concurrent/4 kqueue latency_mean_ns 7.67 µs 7.66 µs 🟢▲ +0.31% 0.47%
concurrent_lockless/1 kqueue latency_mean_ns 2.03 µs 2.03 µs 🟢▲ +0.21% 0.45%
concurrent_lockless/16 kqueue latency_mean_ns 30.03 µs 30.07 µs 🔴▼ -0.35% 0.37%
concurrent_lockless/4 kqueue latency_mean_ns 7.54 µs 7.53 µs 🔴▼ -0.04% 0.30%
pingpong/1 kqueue latency_mean_ns 2.06 µs 2.05 µs 🔴▼ -0.03% 0.29%
pingpong/1024 kqueue latency_mean_ns 2.16 µs 2.15 µs 🔴▼ -0.09% 0.32%
pingpong/64 kqueue latency_mean_ns 2.06 µs 2.06 µs 🔴▼ -0.19% 0.30%
pingpong_lockless/1 kqueue latency_mean_ns 2.03 µs 2.03 µs 🔴▼ -0.02% 0.25%
pingpong_lockless/1024 kqueue latency_mean_ns 2.13 µs 2.13 µs 🔴▼ -0.08% 0.36%
pingpong_lockless/64 kqueue latency_mean_ns 2.03 µs 2.03 µs 🟢▲ +0.32% 0.29%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 1.23 GB/s 1.23 GB/s 🔴▼ -0.01% 0.33%
bidirectional/1048576 kqueue bytes_per_sec 3.84 GB/s 3.84 GB/s 🔴▼ -0.05% 0.53%
bidirectional/16384 kqueue bytes_per_sec 3.84 GB/s 3.85 GB/s 🟢▲ +0.35% 0.59%
bidirectional/262144 kqueue bytes_per_sec 3.85 GB/s 3.83 GB/s 🟢▲ +0.37% 0.76%
bidirectional/4096 kqueue bytes_per_sec 2.91 GB/s 2.91 GB/s 🔴▼ -0.04% 0.38%
bidirectional/65536 kqueue bytes_per_sec 3.85 GB/s 3.85 GB/s 🔴▼ -0.11% 0.59%
bidirectional_lockless/1024 kqueue bytes_per_sec 1.23 GB/s 1.23 GB/s 🔴▼ -0.17% 0.26%
bidirectional_lockless/1048576 kqueue bytes_per_sec 3.91 GB/s 3.92 GB/s 🟢▲ +0.50% 0.53%
bidirectional_lockless/16384 kqueue bytes_per_sec 3.91 GB/s 3.89 GB/s 🔴▼ -0.36% 0.75%
bidirectional_lockless/262144 kqueue bytes_per_sec 3.91 GB/s 3.92 GB/s 🟢▲ +0.31% 0.71%
bidirectional_lockless/4096 kqueue bytes_per_sec 2.95 GB/s 2.96 GB/s 🟢▲ +0.40% 0.29%
bidirectional_lockless/65536 kqueue bytes_per_sec 3.91 GB/s 3.90 GB/s 🔴▼ -0.06% 1.13%
unidirectional/1024 kqueue bytes_per_sec 1.19 GB/s 1.20 GB/s 🟢▲ +0.13% 0.28%
unidirectional/1048576 kqueue bytes_per_sec 3.47 GB/s 3.46 GB/s 🔴▼ -0.46% 0.50%
unidirectional/16384 kqueue bytes_per_sec 3.47 GB/s 3.48 GB/s 🟢▲ +0.12% 0.26%
unidirectional/262144 kqueue bytes_per_sec 3.47 GB/s 3.46 GB/s 🔴▼ -0.14% 0.44%
unidirectional/4096 kqueue bytes_per_sec 2.69 GB/s 2.69 GB/s 🟢▲ +0.15% 0.43%
unidirectional/65536 kqueue bytes_per_sec 3.47 GB/s 3.47 GB/s 🟢▲ +0.33% 0.34%
unidirectional_lockless/1024 kqueue bytes_per_sec 1.20 GB/s 1.20 GB/s 🔴▼ -0.20% 0.24%
unidirectional_lockless/1048576 kqueue bytes_per_sec 3.52 GB/s 3.52 GB/s 🟢▲ +0.01% 0.57%
unidirectional_lockless/16384 kqueue bytes_per_sec 3.52 GB/s 3.52 GB/s 🟢▲ +0.15% 0.49%
unidirectional_lockless/262144 kqueue bytes_per_sec 3.51 GB/s 3.53 GB/s 🟢▲ +0.12% 0.49%
unidirectional_lockless/4096 kqueue bytes_per_sec 2.72 GB/s 2.73 GB/s 🟢▲ +0.82% 0.52%
unidirectional_lockless/65536 kqueue bytes_per_sec 3.52 GB/s 3.52 GB/s 🔴▼ -0.30% 0.29%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 18.74 µs 18.76 µs 🔴▼ -0.03% 0.42%
concurrent/16 kqueue latency_mean_ns 120.55 µs 120.60 µs 🔴▼ -0.05% 0.70%
concurrent/4 kqueue latency_mean_ns 43.40 µs 43.54 µs 🔴▼ -0.12% 1.24%
concurrent_lockless/1 kqueue latency_mean_ns 18.71 µs 18.74 µs 🔴▼ -0.26% 0.26%
concurrent_lockless/16 kqueue latency_mean_ns 119.62 µs 119.74 µs 🔴▼ -0.14% 0.71%
concurrent_lockless/4 kqueue latency_mean_ns 42.99 µs 43.09 µs 🔴▼ -0.16% 0.67%
pingpong/1 kqueue latency_mean_ns 15.43 µs 15.45 µs 🔴▼ -0.19% 0.23%
pingpong/1024 kqueue latency_mean_ns 18.92 µs 18.90 µs 🟢▲ +0.13% 0.20%
pingpong/64 kqueue latency_mean_ns 18.76 µs 18.76 µs 🔴▼ -0.04% 0.61%
pingpong_lockless/1 kqueue latency_mean_ns 15.40 µs 15.38 µs 🟢▲ +0.03% 0.27%
pingpong_lockless/1024 kqueue latency_mean_ns 18.91 µs 18.95 µs 🔴▼ -0.01% 0.41%
pingpong_lockless/64 kqueue latency_mean_ns 18.69 µs 18.75 µs 🔴▼ -0.48% 0.43%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 412.1 MB/s 409.2 MB/s 🔴▼ -0.79% 0.51%
bidirectional/1048576 kqueue bytes_per_sec 7.61 GB/s 7.72 GB/s 🟢▲ +1.04% 1.72%
bidirectional/16384 kqueue bytes_per_sec 4.02 GB/s 4.01 GB/s 🔴▼ -0.11% 0.73%
bidirectional/262144 kqueue bytes_per_sec 8.78 GB/s 8.89 GB/s 🟢▲ +0.88% 3.83%
bidirectional/4096 kqueue bytes_per_sec 1.50 GB/s 1.50 GB/s 🟢▲ +0.09% 1.48%
bidirectional/65536 kqueue bytes_per_sec 7.60 GB/s 7.51 GB/s 🔴▼ -0.97% 1.93%
bidirectional_lockless/1024 kqueue bytes_per_sec 412.2 MB/s 411.5 MB/s 🔴▼ -0.25% 1.13%
bidirectional_lockless/1048576 kqueue bytes_per_sec 7.75 GB/s 7.75 GB/s 🔴▼ -0.37% 1.03%
bidirectional_lockless/16384 kqueue bytes_per_sec 4.03 GB/s 4.04 GB/s 🟢▲ +0.28% 0.78%
bidirectional_lockless/262144 kqueue bytes_per_sec 9.00 GB/s 8.96 GB/s 🟢▲ +0.22% 1.67%
bidirectional_lockless/4096 kqueue bytes_per_sec 1.51 GB/s 1.50 GB/s 🔴▼ -0.36% 0.60%
bidirectional_lockless/65536 kqueue bytes_per_sec 7.71 GB/s 7.53 GB/s 🔴▼ -1.56% 2.70%
multithread/2 kqueue bytes_per_sec 7.56 GB/s 7.45 GB/s 🔴▼ -1.34% 2.16%
multithread/4 kqueue bytes_per_sec 3.68 GB/s 3.72 GB/s 🔴▼ -4.06% 8.28%
multithread/8 kqueue bytes_per_sec 3.38 GB/s 3.43 GB/s 🟢▲ +2.99% 6.90%
unidirectional/1024 kqueue bytes_per_sec 319.7 MB/s 319.7 MB/s 🔴▼ -0.20% 1.06%
unidirectional/1048576 kqueue bytes_per_sec 8.99 GB/s 8.96 GB/s 🔴▼ -0.35% 0.90%
unidirectional/16384 kqueue bytes_per_sec 3.73 GB/s 3.72 GB/s 🔴▼ -0.12% 1.04%
unidirectional/262144 kqueue bytes_per_sec 8.81 GB/s 8.82 GB/s 🟢▲ +0.17% 2.01%
unidirectional/4096 kqueue bytes_per_sec 1.24 GB/s 1.24 GB/s 🟢▲ +0.10% 2.05%
unidirectional/65536 kqueue bytes_per_sec 7.24 GB/s 7.31 GB/s 🟢▲ +0.84% 1.61%
unidirectional_lockless/1024 kqueue bytes_per_sec 328.4 MB/s 327.2 MB/s 🔴▼ -0.47% 0.20%
unidirectional_lockless/1048576 kqueue bytes_per_sec 9.02 GB/s 8.97 GB/s 🔴▼ -0.31% 0.55%
unidirectional_lockless/16384 kqueue bytes_per_sec 3.76 GB/s 3.75 GB/s 🔴▼ -0.54% 0.83%
unidirectional_lockless/262144 kqueue bytes_per_sec 8.90 GB/s 8.93 GB/s 🔴▼ -0.06% 2.53%
unidirectional_lockless/4096 kqueue bytes_per_sec 1.26 GB/s 1.25 GB/s 🔴▼ -0.08% 0.27%
unidirectional_lockless/65536 kqueue bytes_per_sec 7.34 GB/s 7.25 GB/s 🔴▼ -1.74% 1.08%

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

@sgerbino
sgerbino force-pushed the pr/pr-benchmarks branch 7 times, most recently from 94313cf to aeb6cec Compare September 30, 2026 13:56
Add a benchmarks workflow that builds the PR head and its merge-base,
runs the full bench suite in interleaved base/head passes on dedicated
self-hosted runners (Linux epoll+uring, Windows iocp, macOS kqueue),
and posts one advisory PR comment, updated in place on each push.

A row is flagged only when the median of its paired per-iteration
deltas exceeds the larger of a fixed minimum effect size and three
times the sample spread of the noisier side, so the noise floor is
measured live on the same machine rather than maintained as stored
calibration. Iterations alternate starting side so linear drift
cancels. A workflow_dispatch A/A mode benchmarks the merge-base
against itself to audit that flag rule whenever the hardware or the
suite changes.

The comparison and report generation live in a stdlib-only script,
.github/bench/compare.py. It matches benchmark suites dynamically:
benchmarks present on only one side are reported as added or removed
rather than compared, unrecognized metrics degrade to an unsupported
list, and malformed input files are warned about and skipped — the
report never fails a job over suite shape.

Untrusted code never reaches the machines without review: the
pull_request_target gate runs collaborator PRs automatically and
everyone else's only when a maintainer applies the benchmark label,
which is consumed on use and stripped on later pushes so each
approval covers exactly the diff that was reviewed. Head and base
SHAs are pinned at gate time, and all tooling (this script and the
composite actions) executes from the trusted base commit, never from
the pull request.
@sgerbino
sgerbino marked this pull request as ready for review September 30, 2026 15:00
@sgerbino
sgerbino merged commit 6a3eed4 into develop Sep 30, 2026
84 checks passed
@sgerbino
sgerbino deleted the pr/pr-benchmarks branch September 30, 2026 15:37
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