Windows Benchmarks

Generated 2026-11-06 from corosio 0b3830d5c30b — benchmark run. This page is fully generated; do not edit by hand (see the Benchmarks landing page).

Summary

Within noise means the relative difference is within twice the combined run-to-run noise (the root-sum-square of each side’s CV). Differences that small are indistinguishable from measurement jitter. See Methodology for how these figures are computed.

0 faster · 14 within noise · 63 slower of 77 benchmarks — median -5.6% vs Boost.Asio (callbacks) on the same reactor.

Summary — Windows ← slower · within noise · faster → per benchmark, vs Boost.Asio (callbacks) socket_throughput 13 benchmarks slower than asio (callbacks) 13 14 benchmarks within noise than asio (callbacks) 14 -3.1% http_server 11 benchmarks slower than asio (callbacks) 11 -3.4% accept_churn 9 benchmarks slower than asio (callbacks) 9 -6.9% socket_latency 12 benchmarks slower than asio (callbacks) 12 -9.8% fan_out 18 benchmarks slower than asio (callbacks) 18 -10.0%

Test Environment

CPU

AMD Ryzen 5 3600 6-Core Processor

Cores

6

RAM (GB)

64

OS

MSYS_NT-10.0-20348 3.4.7-ea781829.x86_64

Kernel/build

2023-07-05 12:05 UTC

Compiler

c++.exe (x86_64-posix-seh-rev2, Built by MinGW-W64 project) 12.2.0

CMake

cmake version 3.26.3

liburing

n/a

Boost commit

b6d874b77b75085a1b35c640a76d37ab8cd9bb97

Asio commit

e99d9da6d9b76a222e29dcaf3d2df51c788b7527

Asio reactor

IOCP

Capy commit

bdadc6adef8c8eb79da6454373175bb1428be524

Corosio commit

0b3830d5c30b96e4a95c0248953575ba7ffcd4d1

Corosio branch

develop

Date (UTC)

2026-11-05

Iterations

7

Duration per benchmark (s)

2.0

Results

accept_churn

Rate of setting up and tearing down short-lived TCP connections: connect, accept, close.

accept_churn — Windows ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -15% -10% -5% +5% +10% 0% burst/10 — N connects are fired at once, then all N are accepted before closing; N is the burst size. burst/10 — N connects are fired at once, then all N are accepted before closing; N is the burst size. burst/10 burst/100 — N connects are fired at once, then all N are accepted before closing; N is the burst size. burst/100 — N connects are fired at once, then all N are accepted before closing; N is the burst size. burst/100 burst_lockless/10 — Same as burst, with the context in single-threaded lockless mode; N is the burst size. burst_lockless/10 — Same as burst, with the context in single-threaded lockless mode; N is the burst size. burst_lockless/10 burst_lockless/100 — Same as burst, with the context in single-threaded lockless mode; N is the burst size. -4% burst_lockless/100 — Same as burst, with the context in single-threaded lockless mode; N is the burst size. +5% burst_lockless/100 concurrent/1 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. -9% concurrent/1 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. -4% concurrent/1 concurrent/16 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. concurrent/16 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. concurrent/16 concurrent/4 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. concurrent/4 — N independent accept loops run on separate listeners at once, each doing a one-way one-byte transfer (client writes, server reads) per connection; N is the number of loops. concurrent/4 sequential — Single connect/accept/close loop with a one-way one-byte transfer (client writes, server reads) per connection, one connection at a time. sequential — Single connect/accept/close loop with a one-way one-byte transfer (client writes, server reads) per connection, one connection at a time. sequential sequential_lockless — Same as sequential, with the context in single-threaded lockless mode. sequential_lockless — Same as sequential, with the context in single-threaded lockless mode. sequential_lockless
Detailed results
Benchmark Implementation Median CV vs asio

burst/10

corosio (IOCP)

1.57K ops/s

0.60%

-5.6%

burst/10

asio (coroutines)

1.69K ops/s

0.42%

+1.6%

burst/10

asio (callbacks)

1.66K ops/s

0.82%

baseline

burst/100

corosio (IOCP)

154.9 ops/s

0.75%

-5.1%

burst/100

asio (coroutines)

170.3 ops/s

0.59%

+4.3%

burst/100

asio (callbacks)

163.3 ops/s

0.56%

baseline

burst_lockless/10

corosio (IOCP)

1.57K ops/s

0.21%

-5.9%

burst_lockless/10

asio (coroutines)

1.70K ops/s

0.25%

+2.0%

burst_lockless/10

asio (callbacks)

1.67K ops/s

0.23%

baseline

burst_lockless/100

corosio (IOCP)

160.2 ops/s

0.42%

-4.4%

burst_lockless/100

asio (coroutines)

176.1 ops/s

0.42%

+5.1%

burst_lockless/100

asio (callbacks)

167.6 ops/s

0.82%

baseline

concurrent/1

corosio (IOCP)

12.49K ops/s

0.44%

-8.7%

concurrent/1

asio (coroutines)

13.13K ops/s

0.32%

-4.1%

concurrent/1

asio (callbacks)

13.69K ops/s

0.25%

baseline

concurrent/16

corosio (IOCP)

13.47K ops/s

0.16%

-6.9%

concurrent/16

asio (coroutines)

14.01K ops/s

0.33%

-3.2%

concurrent/16

asio (callbacks)

14.47K ops/s

0.23%

baseline

concurrent/4

corosio (IOCP)

13.14K ops/s

0.14%

-7.6%

concurrent/4

asio (coroutines)

13.67K ops/s

0.31%

-3.8%

concurrent/4

asio (callbacks)

14.22K ops/s

0.24%

baseline

sequential

corosio (IOCP)

12.48K ops/s

0.42%

-8.5%

sequential

asio (coroutines)

13.10K ops/s

0.20%

-3.9%

sequential

asio (callbacks)

13.64K ops/s

0.20%

baseline

sequential_lockless

corosio (IOCP)

12.55K ops/s

0.29%

-8.2%

sequential_lockless

asio (coroutines)

13.15K ops/s

0.15%

-3.8%

sequential_lockless

asio (callbacks)

13.67K ops/s

0.19%

baseline


fan_out

Fan-out/fan-in coroutine coordination: a parent starts concurrent sub-requests against echo servers and awaits their completion via a shared latch.

fan_out — Windows, part 1 ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -15% -10% -5% +5% 0% concurrent_parents/1 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -8% concurrent_parents/1 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -11% concurrent_parents/1 concurrent_parents/16 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -12% concurrent_parents/16 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -12% concurrent_parents/16 concurrent_parents/4 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -10% concurrent_parents/4 — N independent parents each fan out to 16 sub-requests at once; N is the number of parents. -10% concurrent_parents/4 concurrent_parents_lockless/1 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -8% concurrent_parents_lockless/1 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -9% concurrent_parents_lockless/1 concurrent_parents_lockless/16 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -12% concurrent_parents_lockless/16 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -10% concurrent_parents_lockless/16 concurrent_parents_lockless/4 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -10% concurrent_parents_lockless/4 — Same as concurrent_parents, with the context in single-threaded lockless mode; N is the number of parents. -10% concurrent_parents_lockless/4
Detailed results
Benchmark Implementation Median CV vs asio

concurrent_parents/1

corosio (IOCP)

7.12K ops/s

0.33%

-8.3%

concurrent_parents/1

asio (coroutines)

6.94K ops/s

0.75%

-10.6%

concurrent_parents/1

asio (callbacks)

7.76K ops/s

0.14%

baseline

concurrent_parents/16

corosio (IOCP)

6.42K ops/s

0.83%

-11.9%

concurrent_parents/16

asio (coroutines)

6.44K ops/s

0.70%

-11.6%

concurrent_parents/16

asio (callbacks)

7.28K ops/s

0.39%

baseline

concurrent_parents/4

corosio (IOCP)

6.84K ops/s

0.70%

-10.4%

concurrent_parents/4

asio (coroutines)

6.90K ops/s

0.45%

-9.6%

concurrent_parents/4

asio (callbacks)

7.63K ops/s

0.29%

baseline

concurrent_parents_lockless/1

corosio (IOCP)

7.10K ops/s

0.37%

-8.3%

concurrent_parents_lockless/1

asio (coroutines)

7.02K ops/s

0.21%

-9.4%

concurrent_parents_lockless/1

asio (callbacks)

7.75K ops/s

0.37%

baseline

concurrent_parents_lockless/16

corosio (IOCP)

6.42K ops/s

1.14%

-11.7%

concurrent_parents_lockless/16

asio (coroutines)

6.53K ops/s

0.82%

-10.2%

concurrent_parents_lockless/16

asio (callbacks)

7.27K ops/s

0.39%

baseline

concurrent_parents_lockless/4

corosio (IOCP)

6.89K ops/s

0.73%

-9.6%

concurrent_parents_lockless/4

asio (coroutines)

6.89K ops/s

0.33%

-9.6%

concurrent_parents_lockless/4

asio (callbacks)

7.63K ops/s

0.30%

baseline

fan_out — Windows, part 2 ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -20% -15% -10% -5% +5% 0% fork_join/1 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/1 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/1 fork_join/16 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/16 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/16 fork_join/4 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. -6% fork_join/4 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/4 fork_join/64 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/64 — One parent starts N sub-requests to echo servers and waits for all to finish before repeating; N is the fan-out width. fork_join/64 fork_join_lockless/1 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/1 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/1 fork_join_lockless/16 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/16 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/16 fork_join_lockless/4 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/4 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. -9% fork_join_lockless/4 fork_join_lockless/64 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/64 — Same as fork_join, with the context in single-threaded lockless mode; N is the fan-out width. fork_join_lockless/64 nested/16 — Two-level fan-out: the parent starts N groups of 4 sub-requests each, each group awaited via its own latch; N is the number of groups. -12% nested/16 — Two-level fan-out: the parent starts N groups of 4 sub-requests each, each group awaited via its own latch; N is the number of groups. nested/16 nested/4 — Two-level fan-out: the parent starts N groups of 4 sub-requests each, each group awaited via its own latch; N is the number of groups. nested/4 — Two-level fan-out: the parent starts N groups of 4 sub-requests each, each group awaited via its own latch; N is the number of groups. nested/4 nested_lockless/16 — Same as nested, with the context in single-threaded lockless mode; N is the number of groups. nested_lockless/16 — Same as nested, with the context in single-threaded lockless mode; N is the number of groups. nested_lockless/16 nested_lockless/4 — Same as nested, with the context in single-threaded lockless mode; N is the number of groups. nested_lockless/4 — Same as nested, with the context in single-threaded lockless mode; N is the number of groups. -14% nested_lockless/4
Detailed results
Benchmark Implementation Median CV vs asio

fork_join/1

corosio (IOCP)

111.8K ops/s

0.44%

-10.0%

fork_join/1

asio (coroutines)

110.9K ops/s

0.31%

-10.7%

fork_join/1

asio (callbacks)

124.1K ops/s

0.37%

baseline

fork_join/16

corosio (IOCP)

7.10K ops/s

0.20%

-8.4%

fork_join/16

asio (coroutines)

6.92K ops/s

0.33%

-10.8%

fork_join/16

asio (callbacks)

7.76K ops/s

0.21%

baseline

fork_join/4

corosio (IOCP)

28.96K ops/s

0.35%

-6.4%

fork_join/4

asio (coroutines)

27.96K ops/s

0.23%

-9.6%

fork_join/4

asio (callbacks)

30.95K ops/s

0.45%

baseline

fork_join/64

corosio (IOCP)

1.71K ops/s

0.97%

-10.3%

fork_join/64

asio (coroutines)

1.72K ops/s

0.56%

-10.0%

fork_join/64

asio (callbacks)

1.91K ops/s

0.30%

baseline

fork_join_lockless/1

corosio (IOCP)

112.2K ops/s

0.27%

-10.0%

fork_join_lockless/1

asio (coroutines)

110.5K ops/s

0.61%

-11.4%

fork_join_lockless/1

asio (callbacks)

124.7K ops/s

0.46%

baseline

fork_join_lockless/16

corosio (IOCP)

7.10K ops/s

0.13%

-8.4%

fork_join_lockless/16

asio (coroutines)

6.96K ops/s

0.28%

-10.3%

fork_join_lockless/16

asio (callbacks)

7.75K ops/s

0.12%

baseline

fork_join_lockless/4

corosio (IOCP)

28.88K ops/s

0.20%

-6.7%

fork_join_lockless/4

asio (coroutines)

28.04K ops/s

0.28%

-9.4%

fork_join_lockless/4

asio (callbacks)

30.95K ops/s

0.28%

baseline

fork_join_lockless/64

corosio (IOCP)

1.72K ops/s

0.86%

-10.2%

fork_join_lockless/64

asio (coroutines)

1.73K ops/s

0.67%

-9.4%

fork_join_lockless/64

asio (callbacks)

1.91K ops/s

0.29%

baseline

nested/16

corosio (IOCP)

1.68K ops/s

0.58%

-11.6%

nested/16

asio (coroutines)

1.68K ops/s

0.58%

-11.7%

nested/16

asio (callbacks)

1.90K ops/s

0.35%

baseline

nested/4

corosio (IOCP)

6.96K ops/s

0.30%

-9.7%

nested/4

asio (coroutines)

6.68K ops/s

0.81%

-13.4%

nested/4

asio (callbacks)

7.71K ops/s

0.23%

baseline

nested_lockless/16

corosio (IOCP)

1.68K ops/s

0.78%

-11.5%

nested_lockless/16

asio (coroutines)

1.68K ops/s

0.72%

-11.7%

nested_lockless/16

asio (callbacks)

1.90K ops/s

0.22%

baseline

nested_lockless/4

corosio (IOCP)

6.94K ops/s

0.20%

-10.0%

nested_lockless/4

asio (coroutines)

6.63K ops/s

0.56%

-14.1%

nested_lockless/4

asio (callbacks)

7.72K ops/s

0.34%

baseline


http_server

Request/response throughput of a minimal HTTP/1.1 server exchanging a fixed small request and canned response over persistent TCP loopback connections.

http_server — Windows ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -10% -7.5% -5% -2.5% +2.5% 0% concurrent/1 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. -2% concurrent/1 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/1 concurrent/16 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/16 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/16 concurrent/32 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/32 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/32 concurrent/4 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/4 — N client/server pairs run the single_conn request/response loop concurrently; N is the number of connections. concurrent/4 multithread/1 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/1 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/1 multithread/16 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. -7% multithread/16 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. -2% multithread/16 multithread/2 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/2 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/2 multithread/4 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/4 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/4 multithread/8 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/8 — 32 client/server pairs share one context serviced by N threads running the context; N is the thread count. multithread/8 single_conn — One client repeatedly sends a fixed small HTTP request to one server and reads the response. single_conn — One client repeatedly sends a fixed small HTTP request to one server and reads the response. single_conn single_conn_lockless — Same as single_conn, with the context in single-threaded lockless mode. single_conn_lockless — Same as single_conn, with the context in single-threaded lockless mode. -4% single_conn_lockless
Detailed results
Benchmark Implementation Median CV vs asio

concurrent/1

corosio (IOCP)

110.6K ops/s

0.34%

-1.7%

concurrent/1

asio (coroutines)

108.8K ops/s

0.44%

-3.4%

concurrent/1

asio (callbacks)

112.6K ops/s

0.60%

baseline

concurrent/16

corosio (IOCP)

107.7K ops/s

0.25%

-3.4%

concurrent/16

asio (coroutines)

107.0K ops/s

0.17%

-3.9%

concurrent/16

asio (callbacks)

111.4K ops/s

0.27%

baseline

concurrent/32

corosio (IOCP)

106.9K ops/s

0.25%

-3.6%

concurrent/32

asio (coroutines)

106.6K ops/s

0.17%

-3.8%

concurrent/32

asio (callbacks)

110.9K ops/s

0.23%

baseline

concurrent/4

corosio (IOCP)

108.4K ops/s

0.32%

-2.5%

concurrent/4

asio (coroutines)

107.5K ops/s

0.26%

-3.3%

concurrent/4

asio (callbacks)

111.2K ops/s

0.41%

baseline

multithread/1

corosio (IOCP)

107.1K ops/s

0.16%

-3.4%

multithread/1

asio (coroutines)

106.6K ops/s

0.08%

-3.9%

multithread/1

asio (callbacks)

110.8K ops/s

0.22%

baseline

multithread/16

corosio (IOCP)

265.2K ops/s

0.40%

-6.8%

multithread/16

asio (coroutines)

277.6K ops/s

0.55%

-2.4%

multithread/16

asio (callbacks)

284.4K ops/s

0.36%

baseline

multithread/2

corosio (IOCP)

180.6K ops/s

0.43%

-4.1%

multithread/2

asio (coroutines)

181.0K ops/s

0.57%

-3.8%

multithread/2

asio (callbacks)

188.3K ops/s

0.63%

baseline

multithread/4

corosio (IOCP)

224.2K ops/s

0.57%

-4.9%

multithread/4

asio (coroutines)

229.5K ops/s

0.43%

-2.7%

multithread/4

asio (callbacks)

235.9K ops/s

0.38%

baseline

multithread/8

corosio (IOCP)

264.7K ops/s

0.38%

-6.5%

multithread/8

asio (coroutines)

275.5K ops/s

0.33%

-2.7%

multithread/8

asio (callbacks)

283.2K ops/s

0.71%

baseline

single_conn

corosio (IOCP)

110.6K ops/s

0.25%

-2.2%

single_conn

asio (coroutines)

108.7K ops/s

0.51%

-3.9%

single_conn

asio (callbacks)

113.1K ops/s

0.32%

baseline

single_conn_lockless

corosio (IOCP)

110.7K ops/s

0.32%

-2.0%

single_conn_lockless

asio (coroutines)

108.5K ops/s

0.49%

-4.1%

single_conn_lockless

asio (callbacks)

113.1K ops/s

0.38%

baseline


socket_latency

Round-trip latency of a TCP loopback connection. Each sample is one full round trip (request out, reply back) across message sizes and concurrent pair counts.

socket_latency — Windows ↑ faster (lower mean latency) · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -20% -15% -10% -5% +5% 0% concurrent/1 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. concurrent/1 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. concurrent/1 concurrent/16 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. -14% concurrent/16 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. -13% concurrent/16 concurrent/4 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. concurrent/4 — N independent 64-byte pingpong pairs run concurrently on one context; N is the number of connection pairs. concurrent/4 concurrent_lockless/1 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. concurrent_lockless/1 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. -5% concurrent_lockless/1 concurrent_lockless/16 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. concurrent_lockless/16 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. concurrent_lockless/16 concurrent_lockless/4 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. concurrent_lockless/4 — Same as concurrent, with the context in single-threaded lockless mode; N is the number of connection pairs. concurrent_lockless/4 pingpong/1 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. pingpong/1 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. pingpong/1 pingpong/1024 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. -9% pingpong/1024 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. pingpong/1024 pingpong/64 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. pingpong/64 — One TCP connection ping-pongs a message client->server->client; N is the message size in bytes. pingpong/64 pingpong_lockless/1 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/1 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/1 pingpong_lockless/1024 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/1024 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/1024 pingpong_lockless/64 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/64 — Same as pingpong, with the context in single-threaded lockless mode; N is the message size in bytes. pingpong_lockless/64
Detailed results
Benchmark Implementation Median CV vs asio

concurrent/1

corosio (IOCP)

7.69 µs

0.15%

-9.6%

concurrent/1

asio (coroutines)

7.42 µs

0.26%

-5.8%

concurrent/1

asio (callbacks)

7.02 µs

0.33%

baseline

concurrent/16

corosio (IOCP)

129.55 µs

5.48%

-13.7%

concurrent/16

asio (coroutines)

128.24 µs

2.53%

-12.5%

concurrent/16

asio (callbacks)

113.98 µs

1.86%

baseline

concurrent/4

corosio (IOCP)

30.83 µs

0.27%

-9.6%

concurrent/4

asio (coroutines)

29.75 µs

0.22%

-5.8%

concurrent/4

asio (callbacks)

28.12 µs

0.27%

baseline

concurrent_lockless/1

corosio (IOCP)

7.68 µs

0.49%

-9.4%

concurrent_lockless/1

asio (coroutines)

7.39 µs

0.44%

-5.4%

concurrent_lockless/1

asio (callbacks)

7.01 µs

0.27%

baseline

concurrent_lockless/16

corosio (IOCP)

123.08 µs

1.00%

-10.7%

concurrent_lockless/16

asio (coroutines)

119.16 µs

0.41%

-7.1%

concurrent_lockless/16

asio (callbacks)

111.24 µs

0.33%

baseline

concurrent_lockless/4

corosio (IOCP)

30.87 µs

0.22%

-10.0%

concurrent_lockless/4

asio (coroutines)

29.72 µs

0.20%

-5.9%

concurrent_lockless/4

asio (callbacks)

28.07 µs

0.33%

baseline

pingpong/1

corosio (IOCP)

7.64 µs

0.36%

-9.2%

pingpong/1

asio (coroutines)

7.40 µs

0.50%

-5.7%

pingpong/1

asio (callbacks)

7.00 µs

0.29%

baseline

pingpong/1024

corosio (IOCP)

7.74 µs

0.30%

-9.1%

pingpong/1024

asio (coroutines)

7.51 µs

0.52%

-5.9%

pingpong/1024

asio (callbacks)

7.10 µs

0.36%

baseline

pingpong/64

corosio (IOCP)

7.66 µs

0.33%

-9.5%

pingpong/64

asio (coroutines)

7.40 µs

0.42%

-5.8%

pingpong/64

asio (callbacks)

6.99 µs

0.35%

baseline

pingpong_lockless/1

corosio (IOCP)

7.68 µs

0.28%

-10.1%

pingpong_lockless/1

asio (coroutines)

7.36 µs

0.31%

-5.6%

pingpong_lockless/1

asio (callbacks)

6.97 µs

0.45%

baseline

pingpong_lockless/1024

corosio (IOCP)

7.79 µs

0.45%

-9.9%

pingpong_lockless/1024

asio (coroutines)

7.50 µs

0.40%

-5.8%

pingpong_lockless/1024

asio (callbacks)

7.09 µs

0.19%

baseline

pingpong_lockless/64

corosio (IOCP)

7.69 µs

0.41%

-10.2%

pingpong_lockless/64

asio (coroutines)

7.42 µs

0.14%

-6.2%

pingpong_lockless/64

asio (callbacks)

6.98 µs

0.43%

baseline


socket_throughput

Sustained byte throughput of a TCP loopback connection under continuous streaming, varying chunk size, direction, and concurrency.

socket_throughput — Windows, part 1 ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -7.5% -5% -2.5% +2.5% 0% bidirectional/1024 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/1024 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/1024 bidirectional/1048576 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/1048576 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. +1% bidirectional/1048576 bidirectional/16384 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/16384 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/16384 bidirectional/262144 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. +0% bidirectional/262144 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/262144 bidirectional/4096 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/4096 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/4096 bidirectional/65536 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. bidirectional/65536 — Both ends of the connection write and read simultaneously; N is the chunk size in bytes. -6% bidirectional/65536 bidirectional_lockless/1024 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. -4% bidirectional_lockless/1024 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/1024 bidirectional_lockless/1048576 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/1048576 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/1048576 bidirectional_lockless/16384 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/16384 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/16384 bidirectional_lockless/262144 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/262144 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/262144 bidirectional_lockless/4096 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/4096 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/4096 bidirectional_lockless/65536 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/65536 — Same as bidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. bidirectional_lockless/65536
Detailed results
Benchmark Implementation Median CV vs asio

bidirectional/1024

corosio (IOCP)

276.9 MB/s

0.42%

-4.4%

bidirectional/1024

asio (coroutines)

277.0 MB/s

0.41%

-4.4%

bidirectional/1024

asio (callbacks)

289.7 MB/s

0.56%

baseline

bidirectional/1048576

corosio (IOCP)

4.73 GB/s

7.36%

-4.0%

bidirectional/1048576

asio (coroutines)

4.99 GB/s

8.67%

+1.3%

bidirectional/1048576

asio (callbacks)

4.92 GB/s

6.03%

baseline

bidirectional/16384

corosio (IOCP)

3.71 GB/s

0.54%

-3.6%

bidirectional/16384

asio (coroutines)

3.66 GB/s

2.25%

-4.9%

bidirectional/16384

asio (callbacks)

3.84 GB/s

0.71%

baseline

bidirectional/262144

corosio (IOCP)

9.57 GB/s

1.10%

+0.1%

bidirectional/262144

asio (coroutines)

9.44 GB/s

6.09%

-1.2%

bidirectional/262144

asio (callbacks)

9.56 GB/s

0.46%

baseline

bidirectional/4096

corosio (IOCP)

1.06 GB/s

0.55%

-4.1%

bidirectional/4096

asio (coroutines)

1.06 GB/s

0.77%

-4.1%

bidirectional/4096

asio (callbacks)

1.11 GB/s

0.39%

baseline

bidirectional/65536

corosio (IOCP)

9.05 GB/s

0.77%

-3.4%

bidirectional/65536

asio (coroutines)

8.82 GB/s

6.83%

-5.7%

bidirectional/65536

asio (callbacks)

9.36 GB/s

0.89%

baseline

bidirectional_lockless/1024

corosio (IOCP)

276.4 MB/s

0.46%

-4.4%

bidirectional_lockless/1024

asio (coroutines)

277.2 MB/s

0.66%

-4.1%

bidirectional_lockless/1024

asio (callbacks)

289.1 MB/s

0.60%

baseline

bidirectional_lockless/1048576

corosio (IOCP)

5.15 GB/s

8.88%

-2.2%

bidirectional_lockless/1048576

asio (coroutines)

4.99 GB/s

7.37%

-5.2%

bidirectional_lockless/1048576

asio (callbacks)

5.27 GB/s

7.80%

baseline

bidirectional_lockless/16384

corosio (IOCP)

3.67 GB/s

0.76%

-3.8%

bidirectional_lockless/16384

asio (coroutines)

3.66 GB/s

2.83%

-4.0%

bidirectional_lockless/16384

asio (callbacks)

3.82 GB/s

0.60%

baseline

bidirectional_lockless/262144

corosio (IOCP)

9.63 GB/s

1.70%

-2.2%

bidirectional_lockless/262144

asio (coroutines)

9.70 GB/s

1.16%

-1.5%

bidirectional_lockless/262144

asio (callbacks)

9.85 GB/s

0.90%

baseline

bidirectional_lockless/4096

corosio (IOCP)

1.06 GB/s

0.15%

-4.3%

bidirectional_lockless/4096

asio (coroutines)

1.06 GB/s

0.34%

-4.2%

bidirectional_lockless/4096

asio (callbacks)

1.11 GB/s

0.14%

baseline

bidirectional_lockless/65536

corosio (IOCP)

8.95 GB/s

1.02%

-2.0%

bidirectional_lockless/65536

asio (coroutines)

8.82 GB/s

0.55%

-3.4%

bidirectional_lockless/65536

asio (callbacks)

9.13 GB/s

1.12%

baseline

socket_throughput — Windows, part 2 ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -4% -2% +2% 0% multithread/2 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -2% multithread/2 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -2% multithread/2 multithread/4 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -2% multithread/4 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -2% multithread/4 multithread/8 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -2% multithread/8 — 32 bidirectional connection pairs share one context serviced by N threads running the context, with 64 KiB chunks; N is the thread count. -1% multithread/8
Detailed results
Benchmark Implementation Median CV vs asio

multithread/2

corosio (IOCP)

12.67 GB/s

0.71%

-2.1%

multithread/2

asio (coroutines)

12.71 GB/s

0.62%

-1.8%

multithread/2

asio (callbacks)

12.95 GB/s

0.58%

baseline

multithread/4

corosio (IOCP)

16.98 GB/s

0.79%

-2.3%

multithread/4

asio (coroutines)

17.10 GB/s

0.53%

-1.6%

multithread/4

asio (callbacks)

17.38 GB/s

0.42%

baseline

multithread/8

corosio (IOCP)

18.31 GB/s

0.69%

-1.6%

multithread/8

asio (coroutines)

18.47 GB/s

0.80%

-0.7%

multithread/8

asio (callbacks)

18.61 GB/s

2.34%

baseline

socket_throughput — Windows, part 3 ↑ faster · dotted line = asio (callbacks) · backend = IOCP corosio asio (coroutines) -10% -5% +5% +10% 0% unidirectional/1024 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/1024 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/1024 unidirectional/1048576 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. +1% unidirectional/1048576 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. +5% unidirectional/1048576 unidirectional/16384 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/16384 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/16384 unidirectional/262144 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/262144 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/262144 unidirectional/4096 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/4096 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/4096 unidirectional/65536 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/65536 — One writer streams to one reader as fast as possible; N is the write/read chunk size in bytes. unidirectional/65536 unidirectional_lockless/1024 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/1024 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/1024 unidirectional_lockless/1048576 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. -4% unidirectional_lockless/1048576 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/1048576 unidirectional_lockless/16384 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/16384 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/16384 unidirectional_lockless/262144 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/262144 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/262144 unidirectional_lockless/4096 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/4096 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/4096 unidirectional_lockless/65536 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. unidirectional_lockless/65536 — Same as unidirectional, with the context in single-threaded lockless mode; N is the chunk size in bytes. -5% unidirectional_lockless/65536
Detailed results
Benchmark Implementation Median CV vs asio

unidirectional/1024

corosio (IOCP)

280.4 MB/s

0.34%

-4.4%

unidirectional/1024

asio (coroutines)

280.1 MB/s

0.53%

-4.5%

unidirectional/1024

asio (callbacks)

293.2 MB/s

0.63%

baseline

unidirectional/1048576

corosio (IOCP)

3.99 GB/s

3.79%

+1.3%

unidirectional/1048576

asio (coroutines)

4.12 GB/s

4.17%

+4.6%

unidirectional/1048576

asio (callbacks)

3.94 GB/s

6.07%

baseline

unidirectional/16384

corosio (IOCP)

3.76 GB/s

0.49%

-3.1%

unidirectional/16384

asio (coroutines)

3.71 GB/s

4.56%

-4.5%

unidirectional/16384

asio (callbacks)

3.88 GB/s

4.63%

baseline

unidirectional/262144

corosio (IOCP)

8.67 GB/s

8.74%

+0.3%

unidirectional/262144

asio (coroutines)

8.75 GB/s

8.82%

+1.2%

unidirectional/262144

asio (callbacks)

8.64 GB/s

11.56%

baseline

unidirectional/4096

corosio (IOCP)

1.08 GB/s

0.23%

-3.9%

unidirectional/4096

asio (coroutines)

1.07 GB/s

1.42%

-4.5%

unidirectional/4096

asio (callbacks)

1.12 GB/s

1.21%

baseline

unidirectional/65536

corosio (IOCP)

9.27 GB/s

9.62%

-2.4%

unidirectional/65536

asio (coroutines)

9.10 GB/s

10.33%

-4.1%

unidirectional/65536

asio (callbacks)

9.49 GB/s

10.55%

baseline

unidirectional_lockless/1024

corosio (IOCP)

281.0 MB/s

0.25%

-3.7%

unidirectional_lockless/1024

asio (coroutines)

279.6 MB/s

0.68%

-4.2%

unidirectional_lockless/1024

asio (callbacks)

291.8 MB/s

0.48%

baseline

unidirectional_lockless/1048576

corosio (IOCP)

4.30 GB/s

4.37%

-4.4%

unidirectional_lockless/1048576

asio (coroutines)

4.60 GB/s

8.61%

+2.2%

unidirectional_lockless/1048576

asio (callbacks)

4.50 GB/s

7.74%

baseline

unidirectional_lockless/16384

corosio (IOCP)

3.76 GB/s

1.21%

-2.7%

unidirectional_lockless/16384

asio (coroutines)

3.75 GB/s

1.08%

-3.1%

unidirectional_lockless/16384

asio (callbacks)

3.87 GB/s

4.56%

baseline

unidirectional_lockless/262144

corosio (IOCP)

9.77 GB/s

1.59%

-0.8%

unidirectional_lockless/262144

asio (coroutines)

9.68 GB/s

3.04%

-1.7%

unidirectional_lockless/262144

asio (callbacks)

9.85 GB/s

3.53%

baseline

unidirectional_lockless/4096

corosio (IOCP)

1.08 GB/s

0.56%

-4.0%

unidirectional_lockless/4096

asio (coroutines)

1.08 GB/s

0.59%

-3.9%

unidirectional_lockless/4096

asio (callbacks)

1.12 GB/s

1.06%

baseline

unidirectional_lockless/65536

corosio (IOCP)

9.31 GB/s

3.43%

-2.2%

unidirectional_lockless/65536

asio (coroutines)

9.00 GB/s

2.20%

-5.4%

unidirectional_lockless/65536

asio (callbacks)

9.52 GB/s

10.70%

baseline