Performance map
Each point connects median throughput with p99 latency. The best balance sits toward the bottom right.
- Large point: median
- Small points: individual runs
← other servers
swm-core 5.1.0 / benchmark snapshot
HTTP and WebSocket: individual runs, throughput, p95/p99, ELU, and RSS.
The result snapshot is versioned with the package and linked to its source CI run.
Each point connects median throughput with p99 latency. The best balance sits toward the bottom right.
← other servers
Short JSON response without an asynchronous boundary.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 210,172 req/s | 4.848 ms | 9.231 ms | 98.76% | 80.47 MiB | 200,670 · 5.04 / 9.687 ms | 219,673 · 4.656 / 8.774 ms |
| uWebSockets.js ref. | 225,143 req/s | 5.954 ms | 8.602 ms | 98.71% | 81.03 MiB | 224,528 · 4.565 / 8.602 ms | 225,758 · 7.342 / 8.602 ms |
| HyperExpress | 81,566 req/s | 12.53 ms | 22.7 ms | 98.82% | 90.68 MiB | 83,007 · 12.29 / 23.15 ms | 80,125 · 12.78 / 22.25 ms |
| micro | 34,845 req/s | 30.0 ms | 42.78 ms | 99.02% | 121.25 MiB | 34,253 · 31.78 / 42.78 ms | 35,436 · 28.22 / 42.78 ms |
| Fastify | 32,653 req/s | 33.4 ms | 38.37 ms | 99.03% | 120.94 MiB | 32,497 · 33.73 / 37.99 ms | 32,808 · 33.07 / 38.75 ms |
| Express | 19,063 req/s | 55.89 ms | 64.85 ms | 99.1% | 123.12 MiB | 19,384 · 55.34 / 66.13 ms | 18,742 · 56.44 / 63.57 ms |
Throughput and p95/p99 tail latency are shown with ELU and RSS: a high request rate should not hide runtime cost.
Short JSON response through an async handler.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 194,957 req/s | 5.244 ms | 9.984 ms | 98.74% | 80.65 MiB | 190,187 · 5.348 / 10.28 ms | 199,726 · 5.14 / 9.687 ms |
| uWebSockets.js ref. | 187,866 req/s | 5.582 ms | 10.29 ms | 98.77% | 81.67 MiB | 196,533 · 5.14 / 9.881 ms | 179,199 · 6.023 / 10.7 ms |
| HyperExpress | 66,594 req/s | 15.29 ms | 29.11 ms | 98.88% | 91.34 MiB | 69,851 · 14.68 / 27.67 ms | 63,336 · 15.89 / 30.55 ms |
| micro | 35,855 req/s | 29.73 ms | 41.19 ms | 98.98% | 123.33 MiB | 35,387 · 31.78 / 38.75 ms | 36,322 · 27.67 / 43.63 ms |
| Fastify | 36,734 req/s | 27.68 ms | 35.82 ms | 99.06% | 123.93 MiB | 37,594 · 27.13 / 34.4 ms | 35,874 · 28.22 / 37.24 ms |
| Express | 22,461 req/s | 47.7 ms | 54.3 ms | 99.07% | 125.03 MiB | 22,193 · 48.17 / 52.15 ms | 22,728 · 47.23 / 56.44 ms |
Scalar response headers and repeated Set-Cookie values.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 132,414 req/s | 8.40 ms | 14.4 ms | 98.81% | 81.23 MiB | 135,359 · 7.489 / 14.4 ms | 129,468 · 9.311 / 14.4 ms |
| uWebSockets.js ref. | 147,641 req/s | 7.063 ms | 13.04 ms | 98.79% | 81.76 MiB | 146,979 · 7.342 / 13.04 ms | 148,303 · 6.783 / 13.04 ms |
| HyperExpress | 60,812 req/s | 17.22 ms | 32.1 ms | 98.88% | 91.5 MiB | 61,622 · 16.54 / 31.78 ms | 60,002 · 17.9 / 32.42 ms |
| micro | 32,381 req/s | 32.45 ms | 38.68 ms | 99.03% | 140.72 MiB | 32,267 · 31.16 / 33.73 ms | 32,495 · 33.73 / 43.63 ms |
| Fastify | 32,955 req/s | 32.45 ms | 41.58 ms | 99.13% | 124.17 MiB | 32,674 · 33.73 / 43.63 ms | 33,236 · 31.16 / 39.52 ms |
| Express | 18,635 req/s | 59.34 ms | 68.86 ms | 99.07% | 123.93 MiB | 18,897 · 57.57 / 66.13 ms | 18,372 · 61.1 / 71.58 ms |
A reusable header set after up-front validation.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 167,566 req/s | 6.09 ms | 11.71 ms | 98.78% | 80.73 MiB | 159,478 · 6.391 / 12.29 ms | 175,653 · 5.789 / 11.13 ms |
| uWebSockets.js ref. | 189,834 req/s | 5.456 ms | 10.18 ms | 98.77% | 81.28 MiB | 189,953 · 5.348 / 10.28 ms | 189,715 · 5.564 / 10.08 ms |
| HyperExpress | 59,461 req/s | 17.38 ms | 32.74 ms | 98.89% | 93.57 MiB | 59,351 · 16.87 / 33.07 ms | 59,570 · 17.9 / 32.42 ms |
| micro | 31,983 req/s | 32.14 ms | 33.41 ms | 99.06% | 125.33 MiB | 33,588 · 30.55 / 32.42 ms | 30,378 · 33.73 / 34.4 ms |
| Fastify | 32,849 req/s | 32.45 ms | 43.26 ms | 98.94% | 122.89 MiB | 32,900 · 31.16 / 41.12 ms | 32,797 · 33.73 / 45.4 ms |
| Express | 19,590 req/s | 54.26 ms | 66.82 ms | 99.07% | 122.92 MiB | 19,512 · 55.34 / 68.81 ms | 19,667 · 53.19 / 64.84 ms |
Receive and parse a small JSON body.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 34,498 req/s | 3.103 ms | 5.565 ms | 98.76% | 81.38 MiB | 34,982 · 3.133 / 5.455 ms | 34,014 · 3.072 / 5.675 ms |
| uWebSockets.js ref. | 32,704 req/s | 3.197 ms | 5.964 ms | 98.73% | 82.88 MiB | 33,158 · 3.133 / 5.905 ms | 32,249 · 3.26 / 6.023 ms |
| HyperExpress | 22,147 req/s | 4.657 ms | 8.776 ms | 98.73% | 141.81 MiB | 22,586 · 4.565 / 8.602 ms | 21,707 · 4.749 / 8.95 ms |
| micro | 13,349 req/s | 8.27 ms | 14.26 ms | 98.88% | 116.59 MiB | 12,939 · 8.433 / 14.68 ms | 13,759 · 8.106 / 13.84 ms |
| Fastify | 12,030 req/s | 9.689 ms | 22.93 ms | 98.9% | 260.81 MiB | 11,880 · 9.881 / 22.7 ms | 12,180 · 9.497 / 23.15 ms |
| Express | 9,154 req/s | 11.7 ms | 21.18 ms | 98.93% | 106.99 MiB | 9,053 · 12.05 / 21.39 ms | 9,255 · 11.35 / 20.97 ms |
Closed-loop ping-pong with a 64-byte message.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 |
|---|---|---|---|---|---|---|---|
| swm-core | 101,414 msg/s | 0.891 ms | 0.927 ms | 98.06% | 67.3 MiB | 102,070 · 0.882 / 0.918 ms | 100,757 · 0.90 / 0.936 ms |
| uWebSockets.js ref. | 107,613 msg/s | 0.815 ms | 0.865 ms | 98.01% | 67.69 MiB | 107,068 · 0.815 / 0.865 ms | 108,158 · 0.815 / 0.865 ms |
| HyperExpress | 104,011 msg/s | 0.857 ms | 0.909 ms | 98.14% | 69.43 MiB | 105,131 · 0.848 / 0.90 ms | 102,891 · 0.865 / 0.918 ms |
| ws | 42,505 msg/s | 2.047 ms | 2.238 ms | 98.22% | 74.46 MiB | 41,934 · 2.067 / 2.282 ms | 43,075 · 2.027 / 2.194 ms |
The same swm-core server runs on @swarmmachina/swm-uws and reference uWebSockets.js. Four balanced runs guard binding replacements against regressions.
performance gate passed
The same synchronous GET over two native bindings.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 | run 3 | run 4 |
|---|---|---|---|---|---|---|---|---|---|
| swm-uws | 219,044 req/s | 4.656 ms | 8.862 ms | 98.72% | 80.42 MiB | 220,784 · 4.656 / 8.774 ms | 210,582 · 4.844 / 9.311 ms | 221,469 · 4.656 / 8.774 ms | 217,304 · 4.656 / 8.95 ms |
| uWebSockets.js ref. | 211,768 req/s | 4.848 ms | 8.95 ms | 98.73% | 81.53 MiB | 217,243 · 4.656 / 8.95 ms | 226,947 · 4.475 / 8.602 ms | 206,293 · 5.789 / 8.95 ms | 203,693 · 5.04 / 9.497 ms |
The same WebSocket echo over two native bindings.
higher is better
lower is better
| Server | Throughput · median | p95 latency · median | p99 latency · median | ELU · median | RSS · median | run 1 | run 2 | run 3 | run 4 |
|---|---|---|---|---|---|---|---|---|---|
| swm-uws | 104,033 msg/s | 0.857 ms | 0.90 ms | 97.98% | 67.17 MiB | 105,114 · 0.848 / 0.90 ms | 103,236 · 0.865 / 0.90 ms | 104,829 · 0.848 / 0.90 ms | 101,570 · 0.865 / 0.918 ms |
| uWebSockets.js ref. | 102,967 msg/s | 0.865 ms | 0.918 ms | 98.09% | 67.86 MiB | 102,945 · 0.865 / 0.918 ms | 101,748 · 0.882 / 0.936 ms | 102,988 · 0.865 / 0.90 ms | 103,628 · 0.848 / 0.918 ms |
The short tick marks the median. Dots show individual runs, while the line between them shows the spread.
Higher throughput is better; lower p95, p99, and RSS are better. ELU describes event-loop saturation rather than a standalone ranking.
The framework comparison and the regression baseline are separate measurement series. This page shows only the joint run.
Results are stored in the repository as a versioned snapshot. The run is reproducible: the source CI run and full commit hash remain part of the page.