- Boost.Coroutine2 does not support migration of coroutines between threads.
- Boost.Fiber does not support it by default.
- On low throughput Rust and C++ implementations are slightly slower than Go.
- There is significant difference (like 10x) between cold and hot runs.
- Looks like Go implementation scales pretty poor.
Go (hot):
% wrc -c 1000 -t 1000 'http://127.0.0.1:8080/api/v1/bench?sleep=5ms&repeat=100'
Running 10s test @ http://127.0.0.1:8080/api/v1/bench?sleep=5ms&repeat=100
1000 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 584.54ms 103.51ms 979.20ms 88.84%
Req/Sec 0.99 0.12 2.00 98.64%
8963 requests in 10.11s, 771.57KB read
Socket errors: connect 0, read 4410, write 0, timeout 0
Requests/sec: 886.39
Transfer/sec: 76.30KB
C++ (hot):
% wrc -c 1000 -t 1000 'http://127.0.0.1:8080/api/v1/bench?sleep=5ms&repeat=100'
Running 10s test @ http://127.0.0.1:8080/api/v1/bench?sleep=5ms&repeat=100
1000 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 539.89ms 73.47ms 1.01s 96.95%
Req/Sec 0.92 0.31 2.00 89.55%
12859 requests in 10.11s, 1.08MB read
Socket errors: connect 0, read 2086, write 0, timeout 0
Requests/sec: 1272.38
Transfer/sec: 109.35KB