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 4.1.1 / benchmark snapshot
HTTP and WebSocket: individual runs, median throughput, and p99 latency.
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 | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 211,327 req/s | 9.04 ms | 212,661 · 8.95 ms | 209,993 · 9.129 ms |
| uWebSockets.js ref. | 197,326 req/s | 9.88 ms | 201,128 · 9.687 ms | 193,524 · 10.08 ms |
| HyperExpress | 82,443 req/s | 23.62 ms | 81,093 · 24.09 ms | 83,793 · 23.15 ms |
| micro | 34,330 req/s | 41.12 ms | 34,992 · 41.94 ms | 33,669 · 40.31 ms |
| Fastify | 32,474 req/s | 38.75 ms | 31,711 · 39.52 ms | 33,236 · 37.99 ms |
| Express | 18,688 req/s | 66.95 ms | 19,381 · 62.32 ms | 17,994 · 71.58 ms |
Throughput and p99 latency are shown separately: a high request rate should not hide worse tail latency.
Short JSON response through an async handler.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 156,178 req/s | 12.53 ms | 158,793 · 12.29 ms | 153,563 · 12.78 ms |
| uWebSockets.js ref. | 151,796 req/s | 12.93 ms | 158,311 · 12.29 ms | 145,281 · 13.57 ms |
| HyperExpress | 69,217 req/s | 28.25 ms | 72,022 · 27.13 ms | 66,413 · 29.36 ms |
| micro | 36,536 req/s | 39.23 ms | 39,174 · 33.07 ms | 33,897 · 45.4 ms |
| Fastify | 37,130 req/s | 35.1 ms | 38,049 · 34.4 ms | 36,212 · 35.79 ms |
| Express | 23,445 req/s | 58.17 ms | 23,262 · 56.44 ms | 23,627 · 59.9 ms |
Scalar response headers and repeated Set-Cookie values.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 138,867 req/s | 13.98 ms | 142,365 · 13.57 ms | 135,369 · 14.4 ms |
| uWebSockets.js ref. | 145,385 req/s | 13.3 ms | 143,473 · 13.57 ms | 147,298 · 13.04 ms |
| HyperExpress | 62,886 req/s | 30.56 ms | 62,075 · 31.16 ms | 63,696 · 29.95 ms |
| micro | 31,741 req/s | 33.74 ms | 31,543 · 34.4 ms | 31,938 · 33.07 ms |
| Fastify | 30,697 req/s | 42.78 ms | 30,406 · 42.78 ms | 30,987 · 42.78 ms |
| Express | 18,722 req/s | 66.79 ms | 18,739 · 66.13 ms | 18,706 · 67.46 ms |
A reusable header set after up-front validation.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 162,836 req/s | 11.94 ms | 156,787 · 12.53 ms | 168,884 · 11.35 ms |
| uWebSockets.js ref. | 164,283 req/s | 11.93 ms | 163,183 · 12.05 ms | 165,382 · 11.81 ms |
| HyperExpress | 61,378 req/s | 31.79 ms | 59,692 · 32.42 ms | 63,063 · 31.16 ms |
| micro | 32,408 req/s | 41.69 ms | 32,720 · 45.4 ms | 32,097 · 37.99 ms |
| Fastify | 32,669 req/s | 41.63 ms | 32,253 · 44.51 ms | 33,085 · 38.75 ms |
| Express | 18,545 req/s | 68.16 ms | 18,248 · 70.18 ms | 18,841 · 66.13 ms |
Receive and parse a small JSON body.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 31,541 req/s | 6.14 ms | 30,917 · 6.266 ms | 32,165 · 6.023 ms |
| uWebSockets.js ref. | 30,399 req/s | 6.39 ms | 29,950 · 6.519 ms | 30,848 · 6.266 ms |
| HyperExpress | 22,454 req/s | 8.60 ms | 22,040 · 8.774 ms | 22,869 · 8.433 ms |
| micro | 13,128 req/s | 14.39 ms | 13,199 · 14.4 ms | 13,058 · 14.4 ms |
| Fastify | 11,255 req/s | 23.16 ms | 11,082 · 23.62 ms | 11,427 · 22.7 ms |
| Express | 8,713 req/s | 19.3 ms | 8,935 · 21.39 ms | 8,491 · 17.2 ms |
Closed-loop ping-pong with a 64-byte message.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 |
|---|---|---|---|---|
| swm-core | 48,330 msg/s | 1.738 ms | 48,109 · 1.846 ms | 48,551 · 1.63 ms |
| uWebSockets.js ref. | 47,542 msg/s | 1.72 ms | 47,268 · 1.744 ms | 47,815 · 1.696 ms |
| ws | 47,519 msg/s | 1.977 ms | 49,388 · 1.855 ms | 45,650 · 2.099 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 | p99 latency · median | run 1 | run 2 | run 3 | run 4 |
|---|---|---|---|---|---|---|
| swm-uws | 204,241 req/s | 9.50 ms | 202,842 · 9.497 ms | 204,749 · 9.497 ms | 203,733 · 9.497 ms | 213,499 · 9.129 ms |
| uWebSockets.js ref. | 197,765 req/s | 9.78 ms | 195,375 · 10.08 ms | 203,544 · 9.497 ms | 197,709 · 9.881 ms | 197,821 · 9.687 ms |
The same WebSocket echo over two native bindings.
higher is better
lower is better
| Server | Throughput · median | p99 latency · median | run 1 | run 2 | run 3 | run 4 |
|---|---|---|---|---|---|---|
| swm-uws | 44,124 msg/s | 1.783 ms | 44,579 · 1.767 ms | 44,830 · 1.799 ms | 43,668 · 1.824 ms | 43,578 · 1.714 ms |
| uWebSockets.js ref. | 43,880 msg/s | 1.861 ms | 44,502 · 1.886 ms | 44,662 · 1.907 ms | 43,258 · 1.712 ms | 43,162 · 1.837 ms |
The short tick marks the median. Dots show individual runs, while the line between them shows the spread.
Higher throughput is better. Lower p99 is better. Values from different scenarios are not comparable.
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.