Repository navigation
Benchmark Results EN
These measurements compare this rust-raknet implementation with TCP, the official C KCP core and quic-go. Ordinary sends and batch APIs are measured with the default build and with an explicitly configured send-policy. They do not measure the RakNet protocol in general.
Measured on October 12, 2026. Intel Core i7-9700F (8 cores), Linux x86_64, kernel 7.0.11-76070011-generic; Rust 1.98.1, Tokio 1.53.2 and Go 1.27.2; optimized builds. All processes ran in a task copy with private caches and a private loopback network namespace. Loopback MTU was 1,500 B, GSO/GRO was limited to one packet, netem's queue limit was 100,000 packets, and processes used nice 10. Host network settings were unchanged.
| Column | GitHub source | Tested version / configuration |
|---|---|---|
| TCP | TCP echo driver, Tokio | Driver 0.1.0; Tokio 1.53.2; Linux TCP stack 7.0.11-76070011-generic |
rust-raknet (send) |
b23r0/rust-raknet | 1.4.0; source revision 1199ac7; default build |
| rust-raknet (batch APIs) | b23r0/rust-raknet | The same default library build; explicit batch APIs |
rust-raknet (send + send-policy) |
b23r0/rust-raknet | Same source; feature enabled; both endpoints call set_send_options(SendOptions::default())
|
rust-raknet (batch APIs + send-policy) |
b23r0/rust-raknet | Same configured build; explicit batch APIs |
| C KCP | skywind3000/kcp | Pinned commit b1a7a21; upstream C core unchanged |
| quic-go | quic-go/quic-go | v0.63.0; Go 1.27.2 |
-
Ordinary sends: both endpoints use
send/recv, without batch API calls. -
Batch APIs: the single-connection client uses
send_batch; the concurrent client usessend_bytes_batch. Echo servers userecv_bytes_batchandsend_bytes_batch. Each call submits at most 16 ready messages; neither endpoint waits to fill a batch. -
Default build:
send-policyis not compiled. Policy columns enable the feature and callset_send_options(SendOptions::default())on both endpoints.
All four rust-raknet columns use ReliableOrdered and a 64-frame reliable flight limit. Policy columns also use a 64 MiB encoded flight-byte limit, a 256 KiB reliable soft queue budget, a 64 KiB unreliable reserve and a 256 KiB flush budget. Optional UDP receive batching and idle maintenance are disabled. Message coalescing is separate from UDP syscall batching.
A UDP datagram packs at most eight non-fragmented messages, within the MTU. Two 800 B messages do not fit together; 4,096 B messages are fragmented. A matched NACK or reliable retransmission timeout disables packing for the rest of that connection, including feedback during warmup. Calling a batch API does not mean every run actually merges messages.
TCP uses TCP_NODELAY, four-byte little-endian record lengths, complete-record writes and reused buffers. C KCP uses message mode, send/receive windows of 64/64 for single-connection runs and 64/128 for concurrent runs, nodelay(1, 10, 2, 1), immediate writes/ACKs, and no FEC or encryption. QUIC uses one bidirectional reliable ordered stream per connection; TLS encryption, congestion control and flow control remain enabled. These implementations do not provide identical features.
Throughput counts verified echoed application payload per direction; higher is better. Lower RTT is better. 1 MiB = 1,048,576 B. Throughput and loaded-latency profiles run three times; sparse latency runs five times. Order rotates across all seven columns, with fresh servers and connections. Random loss affects data and ACKs in both directions.
Values are medians across repetitions; parentheses show the min–max range. Each value includes its unit. C = client, S = server. Ranges and peak RSS are included in each measured table. RTT percentiles are computed within each run, then the median of each run-level percentile is reported.
Linux wait4 records whole-process peak RSS across startup, setup, warmup, load and teardown. It includes runtimes, allocators, application buffers and latency samples, but excludes kernel socket buffers. RSS is neither total network memory nor a per-connection footprint; client and server peaks need not occur together.
Clients keep at most 64 application messages awaiting echoes. Each run has 100 warmups and 300 sequential RTT samples before the measured burst. Rust and Go use four workers; C KCP uses one event loop per process. Throughput runs are not pinned to CPUs, so these are not equal-CPU-efficiency measurements.
| Network profile | Payload / burst count | TCP Throughput (range) RSS: C / S |
rust-raknet (send)Throughput (range) RSS: C / S |
rust-raknet (batch APIs) Throughput (range) RSS: C / S |
rust-raknet (send + send-policy)Throughput (range) RSS: C / S |
rust-raknet (batch APIs + send-policy)Throughput (range) RSS: C / S |
C KCP Throughput (range) RSS: C / S |
quic-go Throughput (range) RSS: C / S |
|---|---|---|---|---|---|---|---|---|
| No injected loss | 800 B / 200,000 messages | 155.70 MiB/s (153.20–158.29 MiB/s) C: 3.47 MiB (3.20–3.63 MiB) S: 3.40 MiB (3.32–3.42 MiB) |
186.77 MiB/s (185.18–187.22 MiB/s) C: 3.70 MiB (3.62–3.88 MiB) S: 3.73 MiB (3.72–4.06 MiB) |
188.15 MiB/s (183.18–192.66 MiB/s) C: 3.86 MiB (3.71–3.92 MiB) S: 3.93 MiB (3.82–4.03 MiB) |
183.84 MiB/s (179.94–184.51 MiB/s) C: 3.85 MiB (3.82–4.00 MiB) S: 3.85 MiB (3.81–3.88 MiB) |
189.79 MiB/s (188.38–189.79 MiB/s) C: 3.96 MiB (3.80–4.00 MiB) S: 3.82 MiB (3.77–3.84 MiB) |
151.63 MiB/s (146.52–153.23 MiB/s) C: 1.75 MiB (1.75–1.88 MiB) S: 1.88 MiB (1.75–1.88 MiB) |
115.12 MiB/s (111.58–116.03 MiB/s) C: 13.97 MiB (13.93–14.16 MiB) S: 13.96 MiB (13.72–14.06 MiB) |
| 1% loss | 800 B / 50,000 messages | 17.81 MiB/s (11.76–25.83 MiB/s) C: 3.70 MiB (3.61–3.74 MiB) S: 3.49 MiB (3.45–3.51 MiB) |
167.31 MiB/s (153.82–168.05 MiB/s) C: 3.89 MiB (3.58–4.10 MiB) S: 3.90 MiB (3.79–3.93 MiB) |
158.95 MiB/s (125.90–164.43 MiB/s) C: 3.80 MiB (3.71–4.02 MiB) S: 3.68 MiB (3.61–3.73 MiB) |
155.70 MiB/s (150.78–158.95 MiB/s) C: 3.82 MiB (3.78–3.87 MiB) S: 3.88 MiB (3.66–4.06 MiB) |
167.31 MiB/s (159.61–174.19 MiB/s) C: 3.70 MiB (3.69–4.09 MiB) S: 3.96 MiB (3.90–4.00 MiB) |
131.80 MiB/s (126.00–142.75 MiB/s) C: 1.75 MiB (1.75–1.75 MiB) S: 1.88 MiB (1.75–1.88 MiB) |
44.67 MiB/s (39.12–75.04 MiB/s) C: 13.70 MiB (13.20–13.95 MiB) S: 13.51 MiB (13.38–13.58 MiB) |
| 5% loss | 800 B / 50,000 messages | 1.03 MiB/s (1.01–1.20 MiB/s) C: 3.57 MiB (3.54–3.63 MiB) S: 3.48 MiB (3.36–3.50 MiB) |
146.72 MiB/s (146.16–156.98 MiB/s) C: 3.68 MiB (3.59–3.79 MiB) S: 4.01 MiB (3.73–4.03 MiB) |
106.85 MiB/s (49.10–141.29 MiB/s) C: 3.92 MiB (3.66–3.92 MiB) S: 3.76 MiB (3.73–3.86 MiB) |
155.70 MiB/s (110.25–160.28 MiB/s) C: 3.98 MiB (3.92–3.98 MiB) S: 3.78 MiB (3.64–3.96 MiB) |
145.05 MiB/s (143.41–151.38 MiB/s) C: 3.76 MiB (3.71–3.96 MiB) S: 3.88 MiB (3.76–4.08 MiB) |
102.06 MiB/s (95.89–107.54 MiB/s) C: 1.88 MiB (1.75–1.88 MiB) S: 1.75 MiB (1.75–1.75 MiB) |
8.07 MiB/s (8.00–8.96 MiB/s) C: 13.92 MiB (13.90–14.17 MiB) S: 13.99 MiB (13.45–14.01 MiB) |
| No injected loss | 64 B / 300,000 messages | 14.36 MiB/s (14.25–14.54 MiB/s) C: 3.63 MiB (3.52–3.66 MiB) S: 3.40 MiB (3.29–3.48 MiB) |
15.94 MiB/s (15.76–15.95 MiB/s) C: 3.68 MiB (3.63–3.74 MiB) S: 3.73 MiB (3.61–3.74 MiB) |
47.07 MiB/s (20.95–50.03 MiB/s) C: 3.66 MiB (3.66–3.79 MiB) S: 3.79 MiB (3.55–3.85 MiB) |
15.10 MiB/s (15.01–15.73 MiB/s) C: 3.73 MiB (3.71–3.75 MiB) S: 3.75 MiB (3.69–3.93 MiB) |
27.96 MiB/s (17.73–49.49 MiB/s) C: 3.82 MiB (3.71–3.89 MiB) S: 3.79 MiB (3.60–3.80 MiB) |
12.13 MiB/s (11.66–12.28 MiB/s) C: 1.75 MiB (1.75–1.75 MiB) S: 1.88 MiB (1.75–1.88 MiB) |
29.02 MiB/s (18.59–30.44 MiB/s) C: 13.76 MiB (13.70–13.77 MiB) S: 13.33 MiB (13.13–13.38 MiB) |
| 1% loss | 64 B / 100,000 messages | 2.62 MiB/s (2.26–2.62 MiB/s) C: 3.50 MiB (3.42–3.52 MiB) S: 3.28 MiB (3.16–3.41 MiB) |
14.60 MiB/s (14.06–15.65 MiB/s) C: 3.80 MiB (3.68–3.83 MiB) S: 3.64 MiB (3.62–3.71 MiB) |
15.30 MiB/s (14.40–15.85 MiB/s) C: 3.67 MiB (3.67–3.67 MiB) S: 3.76 MiB (3.69–3.78 MiB) |
14.85 MiB/s (14.64–15.11 MiB/s) C: 3.71 MiB (3.70–3.79 MiB) S: 3.82 MiB (3.62–3.91 MiB) |
14.96 MiB/s (10.63–15.03 MiB/s) C: 3.82 MiB (3.71–3.90 MiB) S: 3.78 MiB (3.73–3.82 MiB) |
11.39 MiB/s (11.16–11.55 MiB/s) C: 1.88 MiB (1.75–1.88 MiB) S: 1.75 MiB (1.75–1.75 MiB) |
24.55 MiB/s (10.66–24.69 MiB/s) C: 13.07 MiB (12.07–13.07 MiB) S: 11.82 MiB (11.63–11.88 MiB) |
| 5% loss | 64 B / 100,000 messages | 0.13 MiB/s (0.12–0.14 MiB/s) C: 3.48 MiB (3.46–3.78 MiB) S: 3.48 MiB (3.32–3.48 MiB) |
13.56 MiB/s (12.88–14.00 MiB/s) C: 3.66 MiB (3.60–3.71 MiB) S: 3.74 MiB (3.59–3.77 MiB) |
13.38 MiB/s (13.13–14.00 MiB/s) C: 3.66 MiB (3.48–3.69 MiB) S: 3.78 MiB (3.73–3.91 MiB) |
13.62 MiB/s (10.78–13.72 MiB/s) C: 3.73 MiB (3.54–3.87 MiB) S: 3.68 MiB (3.66–3.70 MiB) |
13.53 MiB/s (12.01–13.56 MiB/s) C: 3.65 MiB (3.62–3.72 MiB) S: 3.80 MiB (3.65–3.85 MiB) |
9.85 MiB/s (9.84–10.02 MiB/s) C: 1.88 MiB (1.75–1.88 MiB) S: 1.75 MiB (1.75–1.88 MiB) |
4.91 MiB/s (4.26–5.26 MiB/s) C: 12.63 MiB (12.45–12.70 MiB) S: 12.13 MiB (12.07–12.25 MiB) |
| No injected loss | 4,096 B / 50,000 messages | 350.65 MiB/s (350.02–352.55 MiB/s) C: 3.60 MiB (3.56–3.67 MiB) S: 3.50 MiB (3.48–3.53 MiB) |
282.24 MiB/s (279.02–285.54 MiB/s) C: 4.81 MiB (4.37–4.89 MiB) S: 4.94 MiB (4.93–5.02 MiB) |
283.88 MiB/s (105.98–286.38 MiB/s) C: 4.66 MiB (4.66–4.95 MiB) S: 5.03 MiB (4.81–5.21 MiB) |
282.24 MiB/s (281.03–287.22 MiB/s) C: 4.90 MiB (4.84–4.94 MiB) S: 5.07 MiB (4.92–5.14 MiB) |
286.38 MiB/s (164.40–290.21 MiB/s) C: 5.03 MiB (4.88–5.04 MiB) S: 5.08 MiB (4.87–5.12 MiB) |
239.75 MiB/s (223.99–249.66 MiB/s) C: 1.86 MiB (1.86–1.88 MiB) S: 1.75 MiB (1.75–1.88 MiB) |
212.51 MiB/s (210.72–215.61 MiB/s) C: 14.21 MiB (13.78–14.42 MiB) S: 13.75 MiB (13.67–13.98 MiB) |
| 10 ms RTT + 1% loss | 800 B / 3,000 messages | 1.27 MiB/s (1.06–1.35 MiB/s) C: 3.69 MiB (3.66–3.77 MiB) S: 3.52 MiB (3.38–3.55 MiB) |
3.21 MiB/s (3.15–3.28 MiB/s) C: 3.78 MiB (3.61–3.81 MiB) S: 3.77 MiB (3.71–3.91 MiB) |
2.89 MiB/s (2.78–2.90 MiB/s) C: 3.78 MiB (3.75–3.94 MiB) S: 3.66 MiB (3.58–3.70 MiB) |
3.04 MiB/s (2.76–3.25 MiB/s) C: 3.82 MiB (3.76–3.87 MiB) S: 3.81 MiB (3.81–3.93 MiB) |
2.95 MiB/s (2.90–3.18 MiB/s) C: 3.82 MiB (3.69–3.82 MiB) S: 3.67 MiB (3.49–3.69 MiB) |
2.96 MiB/s (2.89–3.15 MiB/s) C: 1.75 MiB (1.75–1.75 MiB) S: 1.75 MiB (1.75–1.75 MiB) |
1.78 MiB/s (1.66–1.97 MiB/s) C: 11.70 MiB (11.32–11.70 MiB) S: 11.38 MiB (11.13–11.88 MiB) |
Single-connection rust-raknet uses a 1,428 B nominal MTU, including 28 B of IPv4/UDP overhead; C KCP and quic-go use a 1,400 B UDP packet budget. The 4,096 B profile triggers fragmentation in rust-raknet and C KCP.
800 B messages, no injected loss; five runs, each with 1,000 warmups and 10,000 sequential samples. Client and server are pinned to different CPUs; each Rust/Go process has four workers, while C KCP uses one event loop. Each request waits for its echo. The batch API receives only one message per call; nothing is coalesced here.
| Implementation / API | Median RTT (range) | 95th-percentile RTT (range) | 99th-percentile RTT (range) | Peak RSS: C / S (range) |
|---|---|---|---|---|
| TCP | 13.00 µs (12.60–13.30 µs) | 26.80 µs (18.40–29.70 µs) | 66.10 µs (33.20–150.10 µs) | C: 3.91 MiB (3.87–3.93 MiB) S: 3.56 MiB (3.49–3.67 MiB) |
rust-raknet (send) |
17.90 µs (17.30–18.10 µs) | 33.70 µs (30.20–35.70 µs) | 73.10 µs (46.30–264.40 µs) | C: 4.24 MiB (4.12–4.31 MiB) S: 4.02 MiB (3.98–4.29 MiB) |
| rust-raknet (batch APIs) | 18.60 µs (17.50–18.80 µs) | 33.10 µs (31.40–36.70 µs) | 75.50 µs (47.30–111.20 µs) | C: 4.31 MiB (4.21–4.34 MiB) S: 4.10 MiB (3.98–4.21 MiB) |
rust-raknet (send + send-policy) |
17.40 µs (17.10–17.60 µs) | 31.40 µs (30.10–34.70 µs) | 48.60 µs (43.60–110.00 µs) | C: 4.32 MiB (4.09–4.39 MiB) S: 4.03 MiB (3.96–4.05 MiB) |
rust-raknet (batch APIs + send-policy) |
17.50 µs (17.20–18.30 µs) | 32.40 µs (21.80–35.50 µs) | 50.10 µs (46.30–205.50 µs) | C: 4.27 MiB (4.24–4.33 MiB) S: 4.03 MiB (3.93–4.14 MiB) |
| C KCP | 10.20 µs (10.10–10.30 µs) | 24.00 µs (18.10–24.40 µs) | 36.20 µs (33.40–66.60 µs) | C: 1.87 MiB (1.87–1.88 MiB) S: 1.87 MiB (1.75–1.99 MiB) |
| quic-go | 62.50 µs (62.30–63.90 µs) | 108.30 µs (97.30–141.70 µs) | 211.40 µs (126.90–449.30 µs) | C: 13.45 MiB (13.20–13.45 MiB) S: 10.94 MiB (10.88–11.13 MiB) |
These measure the sparse API path, not burst delivery latency. Concurrent throughput's pre-burst RTT samples are also not used as loaded latency below.
Each run verifies 1,048,576 ordered burst echoes with a 16-message application window per connection. Connection IDs, message IDs, complete payloads and ordering are checked. Twenty sequential samples per connection precede a common start barrier; setup and warmup are excluded from the throughput timer. Connections stay open until every burst finishes.
All seven columns use four workers and four server listeners/receive sockets with SO_REUSEPORT. Servers are pinned to CPUs 0–3 and clients to CPUs 4–7. Affinity does not reserve CPUs exclusively.
| Payload | Connections | Injected loss | TCP Throughput (range) RSS: C / S |
rust-raknet (send)Throughput (range) RSS: C / S |
rust-raknet (batch APIs) Throughput (range) RSS: C / S |
rust-raknet (send + send-policy)Throughput (range) RSS: C / S |
rust-raknet (batch APIs + send-policy)Throughput (range) RSS: C / S |
C KCP Throughput (range) RSS: C / S |
quic-go Throughput (range) RSS: C / S |
|---|---|---|---|---|---|---|---|---|---|
| 800 B | 64 connections | 0% | 556.05 MiB/s (410.64–642.81 MiB/s) C: 4.07 MiB (4.06–4.29 MiB) S: 3.42 MiB (3.23–3.54 MiB) |
432.99 MiB/s (385.15–515.15 MiB/s) C: 7.41 MiB (7.39–7.44 MiB) S: 7.78 MiB (7.75–8.02 MiB) |
533.52 MiB/s (405.64–566.27 MiB/s) C: 7.41 MiB (7.34–7.91 MiB) S: 7.91 MiB (7.72–8.25 MiB) |
548.45 MiB/s (464.52–549.28 MiB/s) C: 7.06 MiB (6.88–7.13 MiB) S: 7.81 MiB (7.43–7.86 MiB) |
511.69 MiB/s (347.19–540.66 MiB/s) C: 7.56 MiB (7.39–7.69 MiB) S: 8.07 MiB (7.77–8.41 MiB) |
369.80 MiB/s (363.04–387.54 MiB/s) C: 3.00 MiB (2.88–3.25 MiB) S: 3.25 MiB (3.13–3.25 MiB) |
213.74 MiB/s (180.33–215.28 MiB/s) C: 29.08 MiB (28.82–29.53 MiB) S: 39.49 MiB (34.58–42.39 MiB) |
| 800 B | 256 connections | 0% | 538.72 MiB/s (537.62–568.30 MiB/s) C: 5.82 MiB (4.90–5.95 MiB) S: 3.70 MiB (3.43–3.80 MiB) |
437.67 MiB/s (357.31–440.04 MiB/s) C: 15.65 MiB (15.27–15.83 MiB) S: 14.26 MiB (14.16–14.64 MiB) |
445.78 MiB/s (436.02–468.97 MiB/s) C: 16.65 MiB (16.59–16.74 MiB) S: 14.96 MiB (14.85–15.03 MiB) |
441.06 MiB/s (439.33–519.85 MiB/s) C: 15.70 MiB (15.68–15.97 MiB) S: 14.41 MiB (13.92–14.97 MiB) |
455.89 MiB/s (415.13–469.25 MiB/s) C: 16.51 MiB (16.14–17.27 MiB) S: 15.01 MiB (14.52–15.35 MiB) |
345.96 MiB/s (330.21–358.24 MiB/s) C: 6.38 MiB (6.38–6.50 MiB) S: 6.88 MiB (6.75–7.00 MiB) |
148.73 MiB/s (147.87–170.36 MiB/s) C: 77.93 MiB (75.91–82.06 MiB) S: 109.27 MiB (100.62–116.70 MiB) |
| 800 B | 1,024 connections | 0% | 467.22 MiB/s (455.60–525.70 MiB/s) C: 11.78 MiB (9.52–12.20 MiB) S: 4.89 MiB (4.58–4.89 MiB) |
372.54 MiB/s (347.08–487.01 MiB/s) C: 46.31 MiB (45.80–46.84 MiB) S: 41.92 MiB (40.86–41.95 MiB) |
413.36 MiB/s (394.91–441.03 MiB/s) C: 48.41 MiB (47.44–48.72 MiB) S: 42.28 MiB (41.79–42.38 MiB) |
395.28 MiB/s (333.46–423.21 MiB/s) C: 46.93 MiB (46.00–46.96 MiB) S: 40.87 MiB (39.96–42.48 MiB) |
381.62 MiB/s (362.67–429.23 MiB/s) C: 48.21 MiB (48.11–48.66 MiB) S: 42.17 MiB (41.21–44.30 MiB) |
286.75 MiB/s (268.24–327.30 MiB/s) C: 20.25 MiB (20.25–20.38 MiB) S: 21.00 MiB (20.88–21.00 MiB) |
141.31 MiB/s (136.13–152.38 MiB/s) C: 244.89 MiB (243.89–249.58 MiB) S: 254.45 MiB (250.95–266.39 MiB) |
| 800 B | 2,048 connections | 0% | 475.75 MiB/s (450.53–536.35 MiB/s) C: 21.03 MiB (15.96–21.16 MiB) S: 6.52 MiB (6.32–6.59 MiB) |
322.52 MiB/s (260.15–386.99 MiB/s) C: 85.75 MiB (85.56–86.81 MiB) S: 71.90 MiB (69.68–73.27 MiB) |
298.04 MiB/s (278.00–312.94 MiB/s) C: 89.44 MiB (87.82–90.04 MiB) S: 73.47 MiB (71.82–75.50 MiB) |
309.85 MiB/s (277.92–354.99 MiB/s) C: 87.36 MiB (86.17–89.85 MiB) S: 70.89 MiB (68.00–73.43 MiB) |
329.25 MiB/s (248.12–373.05 MiB/s) C: 89.25 MiB (88.55–89.43 MiB) S: 71.56 MiB (71.06–76.66 MiB) |
249.87 MiB/s (198.62–290.60 MiB/s) C: 38.88 MiB (38.75–38.88 MiB) S: 38.88 MiB (38.88–39.13 MiB) |
103.79 MiB/s (81.86–112.80 MiB/s) C: 473.59 MiB (472.48–589.80 MiB) S: 497.85 MiB (443.79–550.16 MiB) |
| 800 B | 64 connections | 1% | 413.68 MiB/s (352.94–457.15 MiB/s) C: 4.04 MiB (3.96–4.18 MiB) S: 3.27 MiB (3.22–3.46 MiB) |
457.08 MiB/s (388.06–521.29 MiB/s) C: 7.55 MiB (7.32–7.55 MiB) S: 8.13 MiB (7.62–8.40 MiB) |
506.71 MiB/s (433.95–523.45 MiB/s) C: 7.79 MiB (7.62–7.88 MiB) S: 8.28 MiB (7.96–8.47 MiB) |
500.69 MiB/s (385.72–525.45 MiB/s) C: 7.26 MiB (7.12–7.65 MiB) S: 7.98 MiB (7.58–9.02 MiB) |
522.91 MiB/s (503.63–558.91 MiB/s) C: 7.60 MiB (7.32–7.78 MiB) S: 7.93 MiB (7.64–8.17 MiB) |
329.76 MiB/s (291.94–376.96 MiB/s) C: 3.00 MiB (2.88–3.01 MiB) S: 3.25 MiB (3.12–3.25 MiB) |
176.69 MiB/s (147.34–208.96 MiB/s) C: 29.22 MiB (28.43–29.27 MiB) S: 34.60 MiB (31.64–43.68 MiB) |
| 800 B | 256 connections | 1% | 483.00 MiB/s (436.33–505.26 MiB/s) C: 5.80 MiB (5.31–5.81 MiB) S: 3.59 MiB (3.50–3.82 MiB) |
506.58 MiB/s (493.75–511.85 MiB/s) C: 15.97 MiB (15.94–16.43 MiB) S: 15.40 MiB (15.38–15.59 MiB) |
483.16 MiB/s (479.45–497.38 MiB/s) C: 17.00 MiB (16.40–17.00 MiB) S: 15.44 MiB (15.05–15.67 MiB) |
499.84 MiB/s (480.30–521.71 MiB/s) C: 16.50 MiB (15.82–16.70 MiB) S: 15.19 MiB (14.90–15.30 MiB) |
483.76 MiB/s (475.20–499.84 MiB/s) C: 16.84 MiB (16.39–17.03 MiB) S: 15.81 MiB (15.68–15.90 MiB) |
410.95 MiB/s (409.96–411.24 MiB/s) C: 6.38 MiB (6.38–6.38 MiB) S: 6.88 MiB (6.75–6.88 MiB) |
179.86 MiB/s (161.81–182.35 MiB/s) C: 76.25 MiB (74.11–77.55 MiB) S: 69.39 MiB (68.77–89.64 MiB) |
| 800 B | 1,024 connections | 1% | 497.67 MiB/s (463.11–503.74 MiB/s) C: 12.43 MiB (10.54–12.52 MiB) S: 4.92 MiB (4.81–4.95 MiB) |
454.63 MiB/s (425.51–459.25 MiB/s) C: 49.32 MiB (49.00–50.56 MiB) S: 42.74 MiB (41.58–43.43 MiB) |
453.92 MiB/s (445.74–456.33 MiB/s) C: 50.82 MiB (50.17–51.26 MiB) S: 43.96 MiB (42.48–43.99 MiB) |
424.62 MiB/s (420.96–460.39 MiB/s) C: 49.23 MiB (49.00–49.65 MiB) S: 42.14 MiB (41.87–44.68 MiB) |
402.12 MiB/s (384.49–461.58 MiB/s) C: 48.52 MiB (48.13–52.28 MiB) S: 43.18 MiB (42.58–43.42 MiB) |
346.53 MiB/s (316.37–367.14 MiB/s) C: 20.38 MiB (20.38–20.38 MiB) S: 19.63 MiB (19.38–20.13 MiB) |
77.76 MiB/s (76.97–83.36 MiB/s) C: 315.55 MiB (314.25–348.80 MiB) S: 235.21 MiB (208.95–239.70 MiB) |
| 800 B | 2,048 connections | 1% | 469.70 MiB/s (459.18–493.77 MiB/s) C: 19.86 MiB (17.70–21.01 MiB) S: 6.59 MiB (6.56–6.64 MiB) |
341.97 MiB/s (296.70–359.13 MiB/s) C: 88.65 MiB (88.50–90.46 MiB) S: 74.66 MiB (72.72–76.88 MiB) |
369.99 MiB/s (321.91–375.11 MiB/s) C: 92.95 MiB (92.93–92.96 MiB) S: 77.58 MiB (75.41–78.39 MiB) |
355.38 MiB/s (339.30–367.94 MiB/s) C: 89.71 MiB (89.45–89.98 MiB) S: 75.42 MiB (72.52–76.36 MiB) |
324.93 MiB/s (294.61–367.55 MiB/s) C: 93.81 MiB (93.31–94.14 MiB) S: 78.66 MiB (77.67–80.61 MiB) |
325.96 MiB/s (313.13–328.15 MiB/s) C: 38.75 MiB (38.75–38.88 MiB) S: 37.63 MiB (37.50–37.63 MiB) |
34.58 MiB/s (32.33–40.45 MiB/s) C: 748.54 MiB (737.20–782.60 MiB) S: 414.66 MiB (405.23–427.52 MiB) |
| 64 B | 64 connections | 0% | 72.39 MiB/s (67.29–73.56 MiB/s) C: 3.91 MiB (3.61–3.99 MiB) S: 3.27 MiB (3.20–3.35 MiB) |
51.88 MiB/s (50.32–51.93 MiB/s) C: 5.88 MiB (5.63–5.89 MiB) S: 6.00 MiB (5.84–6.02 MiB) |
117.59 MiB/s (104.72–118.28 MiB/s) C: 5.73 MiB (5.72–5.75 MiB) S: 6.25 MiB (6.04–6.44 MiB) |
47.80 MiB/s (41.30–48.46 MiB/s) C: 5.73 MiB (5.73–5.83 MiB) S: 5.97 MiB (5.85–6.14 MiB) |
115.16 MiB/s (110.04–118.86 MiB/s) C: 5.81 MiB (5.81–5.88 MiB) S: 6.05 MiB (6.05–6.20 MiB) |
32.89 MiB/s (30.82–34.91 MiB/s) C: 2.38 MiB (2.26–2.38 MiB) S: 2.50 MiB (2.25–2.50 MiB) |
138.29 MiB/s (130.37–139.94 MiB/s) C: 21.77 MiB (21.42–22.12 MiB) S: 19.87 MiB (19.07–20.01 MiB) |
| 64 B | 1,024 connections | 0% | 53.63 MiB/s (49.30–54.59 MiB/s) C: 9.65 MiB (9.07–9.67 MiB) S: 4.11 MiB (3.95–4.16 MiB) |
47.00 MiB/s (44.10–47.15 MiB/s) C: 32.38 MiB (32.21–32.65 MiB) S: 27.48 MiB (26.37–27.51 MiB) |
142.00 MiB/s (138.96–144.54 MiB/s) C: 31.88 MiB (31.82–32.49 MiB) S: 25.93 MiB (25.65–25.95 MiB) |
49.86 MiB/s (46.67–50.46 MiB/s) C: 32.77 MiB (32.59–32.99 MiB) S: 27.43 MiB (27.02–28.04 MiB) |
144.83 MiB/s (144.53–147.80 MiB/s) C: 32.33 MiB (32.11–32.51 MiB) S: 26.24 MiB (26.11–26.29 MiB) |
42.64 MiB/s (41.42–43.80 MiB/s) C: 8.88 MiB (8.75–8.88 MiB) S: 9.38 MiB (9.38–9.50 MiB) |
107.73 MiB/s (106.19–109.10 MiB/s) C: 145.95 MiB (139.64–148.52 MiB) S: 95.89 MiB (94.64–96.89 MiB) |
| 64 B | 64 connections | 1% | 41.23 MiB/s (40.04–49.52 MiB/s) C: 3.72 MiB (3.70–3.93 MiB) S: 3.30 MiB (3.27–3.32 MiB) |
46.41 MiB/s (43.05–47.78 MiB/s) C: 6.01 MiB (5.88–6.09 MiB) S: 6.12 MiB (6.00–6.23 MiB) |
48.29 MiB/s (42.92–48.35 MiB/s) C: 5.95 MiB (5.87–6.00 MiB) S: 6.45 MiB (6.21–6.51 MiB) |
45.16 MiB/s (44.55–47.56 MiB/s) C: 5.84 MiB (5.80–5.98 MiB) S: 6.12 MiB (6.00–6.14 MiB) |
48.95 MiB/s (45.18–49.53 MiB/s) C: 6.02 MiB (6.01–6.06 MiB) S: 6.36 MiB (6.24–6.38 MiB) |
33.13 MiB/s (31.62–34.48 MiB/s) C: 2.26 MiB (2.25–2.38 MiB) S: 2.38 MiB (2.25–2.50 MiB) |
64.24 MiB/s (48.30–66.69 MiB/s) C: 21.68 MiB (21.57–21.98 MiB) S: 19.05 MiB (18.89–19.82 MiB) |
| 64 B | 1,024 connections | 1% | 45.25 MiB/s (45.23–49.36 MiB/s) C: 9.55 MiB (9.08–9.56 MiB) S: 4.23 MiB (4.04–4.36 MiB) |
42.53 MiB/s (42.16–44.21 MiB/s) C: 34.18 MiB (33.88–35.03 MiB) S: 28.25 MiB (27.84–28.43 MiB) |
47.90 MiB/s (45.21–50.35 MiB/s) C: 35.03 MiB (34.45–36.13 MiB) S: 30.71 MiB (29.51–31.03 MiB) |
42.91 MiB/s (41.62–43.62 MiB/s) C: 34.96 MiB (33.21–35.27 MiB) S: 29.32 MiB (29.29–29.82 MiB) |
49.38 MiB/s (42.25–52.09 MiB/s) C: 36.15 MiB (35.83–36.56 MiB) S: 30.37 MiB (30.26–30.45 MiB) |
39.81 MiB/s (39.51–42.11 MiB/s) C: 8.75 MiB (8.75–8.88 MiB) S: 9.25 MiB (9.25–9.38 MiB) |
79.28 MiB/s (74.21–85.47 MiB/s) C: 143.39 MiB (135.39–154.89 MiB) S: 97.64 MiB (97.27–97.77 MiB) |
Concurrent rust-raknet uses the default nominal MTU of 1,400 B. quic-go uses a 1,372 B UDP packet budget with path MTU discovery disabled. C KCP uses a 1,400 B UDP MTU; its physical budget is 28 B larger, but the 64 B and 800 B messages remain unfragmented in all three.
Concurrent clients use --loaded-rtt: each message is timestamped before sending, then measured when its verified echo is consumed throughout the burst. This includes client and server queueing. Each run verifies 262,144 burst echoes using the same 16-message application window, workers, CPU placement and server modes; each profile runs three times.
Latency sampling runs separately from throughput; its instrumented throughput is not mixed into the tables above. RSS includes the client's retained RTT samples, aggregation and sorting.
| Payload | Connections | Injected loss | TCP RTT median / 99th (range) RSS: C / S |
rust-raknet (send)RTT median / 99th (range) RSS: C / S |
rust-raknet (batch APIs) RTT median / 99th (range) RSS: C / S |
rust-raknet (send + send-policy)RTT median / 99th (range) RSS: C / S |
rust-raknet (batch APIs + send-policy)RTT median / 99th (range) RSS: C / S |
C KCP RTT median / 99th (range) RSS: C / S |
quic-go RTT median / 99th (range) RSS: C / S |
|---|---|---|---|---|---|---|---|---|---|
| 64 B | 64 connections | 0% | 50%: 0.96 ms (0.92–0.97 ms) 99%: 4.59 ms (3.79–8.62 ms) C: 11.70 MiB (11.48–11.79 MiB) S: 3.16 MiB (3.10–3.18 MiB) |
50%: 1.11 ms (0.96–1.13 ms) 99%: 4.13 ms (3.35–7.12 ms) C: 13.30 MiB (13.23–13.52 MiB) S: 5.79 MiB (5.59–5.94 MiB) |
50%: 0.46 ms (0.41–0.49 ms) 99%: 4.29 ms (3.63–5.45 ms) C: 13.21 MiB (13.07–13.47 MiB) S: 5.93 MiB (5.88–6.04 MiB) |
50%: 1.08 ms (1.04–1.28 ms) 99%: 4.23 ms (3.86–8.13 ms) C: 13.50 MiB (13.45–13.59 MiB) S: 5.82 MiB (5.66–5.84 MiB) |
50%: 0.46 ms (0.45–0.48 ms) 99%: 4.18 ms (1.05–4.20 ms) C: 13.31 MiB (13.29–13.61 MiB) S: 5.85 MiB (5.80–6.04 MiB) |
50%: 1.31 ms (1.30–1.32 ms) 99%: 10.16 ms (6.87–11.64 ms) C: 6.26 MiB (6.12–6.36 MiB) S: 2.50 MiB (2.25–2.50 MiB) |
50%: 0.37 ms (0.34–0.41 ms) 99%: 1.89 ms (1.84–3.18 ms) C: 32.32 MiB (31.20–33.02 MiB) S: 17.45 MiB (17.25–17.52 MiB) |
| 64 B | 1,024 connections | 0% | 50%: 18.99 ms (17.77–19.36 ms) 99%: 35.03 ms (32.64–35.43 ms) C: 16.77 MiB (16.26–16.99 MiB) S: 4.04 MiB (3.90–4.18 MiB) |
50%: 16.90 ms (15.81–18.16 ms) 99%: 94.65 ms (40.14–95.26 ms) C: 36.48 MiB (36.36–36.76 MiB) S: 23.37 MiB (22.90–24.15 MiB) |
50%: 4.70 ms (4.46–4.85 ms) 99%: 19.61 ms (19.57–20.56 ms) C: 37.57 MiB (37.43–38.11 MiB) S: 24.38 MiB (24.24–24.44 MiB) |
50%: 15.81 ms (15.25–17.53 ms) 99%: 101.42 ms (35.93–104.92 ms) C: 36.51 MiB (36.48–36.63 MiB) S: 24.37 MiB (23.33–24.41 MiB) |
50%: 4.86 ms (4.83–5.30 ms) 99%: 19.19 ms (18.10–21.89 ms) C: 38.03 MiB (37.87–38.07 MiB) S: 24.65 MiB (24.57–24.85 MiB) |
50%: 7.37 ms (6.73–8.61 ms) 99%: 120.25 ms (112.92–160.63 ms) C: 10.69 MiB (10.69–10.94 MiB) S: 9.38 MiB (9.38–9.38 MiB) |
50%: 9.01 ms (8.97–9.71 ms) 99%: 13.32 ms (12.90–16.47 ms) C: 140.02 MiB (137.39–140.58 MiB) S: 88.89 MiB (87.69–90.89 MiB) |
| 64 B | 64 connections | 1% | 50%: 0.62 ms (0.61–0.72 ms) 99%: 5.88 ms (5.06–6.54 ms) C: 11.54 MiB (11.50–11.73 MiB) S: 3.28 MiB (3.22–3.29 MiB) |
50%: 0.92 ms (0.88–1.02 ms) 99%: 4.97 ms (4.60–6.16 ms) C: 13.48 MiB (13.46–13.79 MiB) S: 5.91 MiB (5.89–6.00 MiB) |
50%: 0.92 ms (0.87–0.97 ms) 99%: 4.54 ms (3.68–4.82 ms) C: 13.62 MiB (13.59–13.90 MiB) S: 6.17 MiB (6.09–6.35 MiB) |
50%: 0.95 ms (0.91–0.96 ms) 99%: 6.20 ms (3.96–6.51 ms) C: 13.74 MiB (13.62–13.77 MiB) S: 5.92 MiB (5.86–6.22 MiB) |
50%: 0.96 ms (0.91–1.00 ms) 99%: 4.82 ms (4.29–4.84 ms) C: 13.81 MiB (13.71–14.07 MiB) S: 6.24 MiB (6.21–6.24 MiB) |
50%: 1.25 ms (1.21–1.44 ms) 99%: 7.37 ms (7.33–8.08 ms) C: 6.34 MiB (6.15–6.36 MiB) S: 2.38 MiB (2.38–2.38 MiB) |
50%: 0.10 ms (0.10–0.12 ms) 99%: 27.24 ms (27.23–27.36 ms) C: 32.52 MiB (31.79–34.39 MiB) S: 17.32 MiB (16.83–17.37 MiB) |
| 64 B | 1,024 connections | 1% | 50%: 16.30 ms (16.20–17.18 ms) 99%: 40.97 ms (38.60–43.32 ms) C: 16.58 MiB (15.57–17.49 MiB) S: 3.91 MiB (3.89–3.95 MiB) |
50%: 18.21 ms (17.97–18.25 ms) 99%: 61.24 ms (57.43–66.63 ms) C: 37.43 MiB (37.01–37.52 MiB) S: 24.75 MiB (24.47–24.75 MiB) |
50%: 12.36 ms (12.18–15.99 ms) 99%: 39.28 ms (36.48–96.98 ms) C: 38.88 MiB (37.86–39.56 MiB) S: 25.61 MiB (25.61–26.52 MiB) |
50%: 16.61 ms (16.42–18.79 ms) 99%: 109.33 ms (65.97–109.70 ms) C: 36.77 MiB (35.29–39.10 MiB) S: 26.01 MiB (25.34–26.05 MiB) |
50%: 12.45 ms (11.62–15.14 ms) 99%: 43.40 ms (35.63–84.78 ms) C: 37.48 MiB (36.12–38.46 MiB) S: 26.17 MiB (25.97–26.54 MiB) |
50%: 5.90 ms (5.03–8.88 ms) 99%: 161.43 ms (111.57–165.05 ms) C: 10.94 MiB (10.82–10.94 MiB) S: 9.25 MiB (9.25–9.38 MiB) |
50%: 8.92 ms (8.38–10.94 ms) 99%: 59.60 ms (47.84–73.50 ms) C: 134.08 MiB (131.52–138.64 MiB) S: 89.07 MiB (86.48–90.95 MiB) |
| 800 B | 64 connections | 0% | 50%: 1.18 ms (1.16–1.22 ms) 99%: 8.77 ms (5.87–9.36 ms) C: 11.88 MiB (11.76–11.89 MiB) S: 3.37 MiB (3.14–3.42 MiB) |
50%: 1.15 ms (1.15–1.20 ms) 99%: 8.05 ms (3.26–8.41 ms) C: 14.66 MiB (14.49–14.85 MiB) S: 7.12 MiB (6.91–7.78 MiB) |
50%: 1.16 ms (1.14–1.22 ms) 99%: 8.84 ms (8.39–9.00 ms) C: 14.82 MiB (14.81–14.83 MiB) S: 7.30 MiB (7.29–7.34 MiB) |
50%: 1.13 ms (1.10–1.16 ms) 99%: 9.05 ms (9.02–9.21 ms) C: 14.71 MiB (14.60–14.85 MiB) S: 7.17 MiB (7.17–7.19 MiB) |
50%: 1.21 ms (1.18–1.27 ms) 99%: 5.42 ms (3.84–8.76 ms) C: 15.00 MiB (14.90–15.01 MiB) S: 7.07 MiB (7.04–7.62 MiB) |
50%: 1.17 ms (1.16–1.21 ms) 99%: 16.37 ms (15.58–17.62 ms) C: 6.96 MiB (6.93–6.97 MiB) S: 3.13 MiB (3.13–3.25 MiB) |
50%: 3.08 ms (3.03–3.12 ms) 99%: 11.50 ms (9.64–12.21 ms) C: 37.70 MiB (37.45–40.16 MiB) S: 30.24 MiB (29.33–31.19 MiB) |
| 800 B | 1,024 connections | 0% | 50%: 22.70 ms (21.95–24.31 ms) 99%: 42.70 ms (41.55–75.24 ms) C: 19.46 MiB (18.15–20.46 MiB) S: 5.02 MiB (4.86–5.08 MiB) |
50%: 21.35 ms (13.79–21.76 ms) 99%: 114.12 ms (58.20–120.21 ms) C: 50.53 MiB (50.32–51.90 MiB) S: 35.95 MiB (34.48–36.38 MiB) |
50%: 16.88 ms (10.23–18.16 ms) 99%: 117.16 ms (107.80–190.99 ms) C: 50.95 MiB (49.53–51.82 MiB) S: 35.30 MiB (34.23–35.42 MiB) |
50%: 20.42 ms (16.57–21.18 ms) 99%: 42.81 ms (40.26–117.52 ms) C: 50.59 MiB (50.52–50.68 MiB) S: 36.27 MiB (34.35–36.39 MiB) |
50%: 12.39 ms (10.59–18.19 ms) 99%: 169.10 ms (109.53–187.16 ms) C: 51.48 MiB (51.21–51.66 MiB) S: 35.09 MiB (34.91–36.32 MiB) |
50%: 18.82 ms (18.65–20.18 ms) 99%: 107.54 ms (102.72–118.36 ms) C: 22.19 MiB (22.07–22.32 MiB) S: 20.63 MiB (20.12–20.75 MiB) |
50%: 71.29 ms (69.26–71.72 ms) 99%: 140.18 ms (109.03–283.41 ms) C: 244.89 MiB (222.95–249.27 MiB) S: 150.57 MiB (149.33–175.30 MiB) |
| 800 B | 64 connections | 1% | 50%: 0.64 ms (0.63–0.66 ms) 99%: 7.02 ms (6.99–7.43 ms) C: 11.82 MiB (11.67–11.84 MiB) S: 3.30 MiB (3.23–3.39 MiB) |
50%: 1.03 ms (1.02–1.19 ms) 99%: 5.91 ms (5.70–6.11 ms) C: 15.04 MiB (14.72–15.32 MiB) S: 7.23 MiB (7.18–7.94 MiB) |
50%: 1.05 ms (1.03–1.10 ms) 99%: 6.06 ms (5.42–6.52 ms) C: 15.16 MiB (14.84–15.44 MiB) S: 7.55 MiB (7.46–7.62 MiB) |
50%: 1.08 ms (0.95–1.16 ms) 99%: 5.85 ms (5.10–6.30 ms) C: 14.98 MiB (14.89–15.22 MiB) S: 7.32 MiB (7.31–7.63 MiB) |
50%: 1.02 ms (1.02–1.04 ms) 99%: 5.90 ms (5.61–6.11 ms) C: 14.98 MiB (14.95–15.06 MiB) S: 7.50 MiB (7.50–7.53 MiB) |
50%: 1.24 ms (1.03–1.31 ms) 99%: 11.33 ms (6.75–11.36 ms) C: 6.79 MiB (6.73–6.89 MiB) S: 3.13 MiB (3.00–3.25 MiB) |
50%: 3.20 ms (3.15–3.29 ms) 99%: 13.52 ms (12.98–23.95 ms) C: 40.48 MiB (36.59–41.42 MiB) S: 29.52 MiB (28.62–33.45 MiB) |
| 800 B | 1,024 connections | 1% | 50%: 25.00 ms (19.25–26.59 ms) 99%: 82.13 ms (53.30–85.70 ms) C: 20.33 MiB (20.15–20.54 MiB) S: 4.97 MiB (4.71–5.04 MiB) |
50%: 21.11 ms (19.79–22.75 ms) 99%: 122.90 ms (90.12–136.39 ms) C: 51.90 MiB (50.38–52.18 MiB) S: 36.71 MiB (36.62–37.41 MiB) |
50%: 30.06 ms (22.12–30.13 ms) 99%: 340.38 ms (193.22–355.15 ms) C: 53.13 MiB (52.59–54.25 MiB) S: 38.64 MiB (37.71–39.57 MiB) |
50%: 19.21 ms (17.43–30.82 ms) 99%: 195.16 ms (105.69–200.33 ms) C: 51.19 MiB (49.07–53.82 MiB) S: 36.22 MiB (35.62–37.24 MiB) |
50%: 18.11 ms (13.85–21.74 ms) 99%: 212.59 ms (201.87–336.37 ms) C: 53.09 MiB (52.64–53.35 MiB) S: 37.80 MiB (37.38–37.97 MiB) |
50%: 23.50 ms (13.31–24.95 ms) 99%: 175.31 ms (136.41–264.19 ms) C: 22.32 MiB (22.07–22.32 MiB) S: 19.88 MiB (18.75–20.00 MiB) |
50%: 78.05 ms (75.61–81.64 ms) 99%: 365.24 ms (338.86–430.47 ms) C: 245.64 MiB (240.02–252.82 MiB) S: 191.64 MiB (190.14–205.88 MiB) |
- At 64 B and 1,024 connections without injected loss, default ordinary sends deliver 47.00 MiB/s, and batch APIs 142.00 MiB/s. TCP, C KCP and quic-go deliver 53.63 MiB/s, 42.64 MiB/s and 107.73 MiB/s, respectively.
- For one connection, 800 B messages and 5% loss, default ordinary sends deliver 146.72 MiB/s. TCP, C KCP and quic-go deliver 1.03 MiB/s, 102.06 MiB/s and 8.07 MiB/s, respectively. These describe this configured reliable ordered echo workload.
- At 800 B and 1,024 connections without injected loss, the configured policy changes ordinary sends from 372.54 MiB/s to 395.28 MiB/s, and batch APIs from 413.36 MiB/s to 381.62 MiB/s.
- At 64 B and 1,024 connections without injected loss, the configured policy changes ordinary loaded median RTT from 16.90 ms to 15.81 ms, and 99th-percentile RTT from 94.65 ms to 101.42 ms. Compare throughput, slow-message latency and memory together.
All profiles use reliable ordered traffic. They do not test mixed reliable/unreliable scheduling, abrupt bandwidth changes or congestion fairness. send-policy remains optional. This matrix cannot replace mixed-traffic validation and is not a controlled before/after comparison with an older revision.
UDP receive buffers can overflow even without injected loss. Namespace-local UDP error counters and qdisc statistics were recorded for each run. Short workloads, random loss and CPU scheduling produce variation; small differences are not evidence of statistical significance or a universal ranking.
Maximum namespace UDP receive-buffer drops in one throughput run: rust-raknet (send): 331,307 datagrams; rust-raknet (batch APIs): 309,627 datagrams; rust-raknet (send + send-policy): 220,506 datagrams; rust-raknet (batch APIs + send-policy): 325,673 datagrams; C KCP: 651,641 datagrams; quic-go: 3,351 datagrams.
All 623 measurements completed with verified echoes: 168 single-connection throughput runs, 35 sparse-latency runs, 252 concurrent-throughput runs and 168 loaded-latency runs.
Default drivers, API flags and workloads are documented in the benchmark README, the C KCP adapters and the quic-go adapters. Policy columns were built in a separate validation copy, adding calls to apply SendOptions::default() to each connected or accepted socket.
The README replaces only the plain send sparse 99th-percentile median with 73.10 µs. Its surrounding ranges, other percentiles and RSS still come from the original five-run matrix. The replacement came from ten additional runs, each with 1,000 warmup and 10,000 measured RTTs: 56.70–106.70 µs across run-level 99th percentiles. The original median was 174.10 µs (46.30–264.40 µs). Identical binaries were used; this is not a code optimization or a new cross-protocol ranking.
The dedicated retest also completed 56 loaded measurements (seven repeats of eight profiles); those values did not replace the README loaded tables. All 66 retest measurements passed.
English · 简体中文 · GitHub · crates.io 1.4.0 · Reviewed / 核对:2026-10-12 / b909c93
- Overview
- Quick start
- Blocking calls and shared runtimes
- Public API index
- Five reliability modes
- RakNet wire format and recovery
- Message lifecycle and limits
- Bytes and explicit batching
- Send policy
- Recovery policy and tail probes
- Every configuration parameter
- Concurrency and socket tuning
- Errors, deadlines and cancellation
- Congestion and deployment boundaries
- Benchmark results
- Benchmark methodology
- Benchmark reproduction
- Minecraft Bedrock proxy
- Troubleshooting and development
- Release history and upgrading