swm-core 4.1.1 / benchmark snapshot

swm-core benchmarks

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.

24.16.0
Node.js
Intel Xeon E5-2680 v4
processor
Linux x64
system
62.63 GiB
memory
25/07/2026
measured

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

Performance mapEach point connects median throughput with p99 latency. The best balance sits toward the bottom right.better balance ↘swm-coreuWebSockets.js ref.HyperExpressmicroFastifyExpress

HTTP and WebSocket comparison

Throughput and p99 latency are shown separately: a high request rate should not hide worse tail latency.

GET /base-async

Short JSON response through an async handler.

GET
/base-async
100
connections
2 × 6s
Runs

Throughput

higher is better

  1. swm-core156,178 req/s
  2. uWebSockets.js ref.151,796 req/s
  3. HyperExpress69,217 req/s
  4. micro36,536 req/s
  5. Fastify37,130 req/s
  6. Express23,445 req/s

p99 latency

lower is better

  1. swm-core12.53 ms
  2. uWebSockets.js ref.12.93 ms
  3. HyperExpress28.25 ms
  4. micro39.23 ms
  5. Fastify35.1 ms
  6. Express58.17 ms
GET /base-async
ServerThroughput · medianp99 latency · medianrun 1run 2
swm-core156,178 req/s12.53 ms158,793 · 12.29 ms153,563 · 12.78 ms
uWebSockets.js ref.151,796 req/s12.93 ms158,311 · 12.29 ms145,281 · 13.57 ms
HyperExpress69,217 req/s28.25 ms72,022 · 27.13 ms66,413 · 29.36 ms
micro36,536 req/s39.23 ms39,174 · 33.07 ms33,897 · 45.4 ms
Fastify37,130 req/s35.1 ms38,049 · 34.4 ms36,212 · 35.79 ms
Express23,445 req/s58.17 ms23,262 · 56.44 ms23,627 · 59.9 ms

GET /headers

Scalar response headers and repeated Set-Cookie values.

GET
/headers
100
connections
2 × 6s
Runs

Throughput

higher is better

  1. swm-core138,867 req/s
  2. uWebSockets.js ref.145,385 req/s
  3. HyperExpress62,886 req/s
  4. micro31,741 req/s
  5. Fastify30,697 req/s
  6. Express18,722 req/s

p99 latency

lower is better

  1. swm-core13.98 ms
  2. uWebSockets.js ref.13.3 ms
  3. HyperExpress30.56 ms
  4. micro33.74 ms
  5. Fastify42.78 ms
  6. Express66.79 ms
GET /headers
ServerThroughput · medianp99 latency · medianrun 1run 2
swm-core138,867 req/s13.98 ms142,365 · 13.57 ms135,369 · 14.4 ms
uWebSockets.js ref.145,385 req/s13.3 ms143,473 · 13.57 ms147,298 · 13.04 ms
HyperExpress62,886 req/s30.56 ms62,075 · 31.16 ms63,696 · 29.95 ms
micro31,741 req/s33.74 ms31,543 · 34.4 ms31,938 · 33.07 ms
Fastify30,697 req/s42.78 ms30,406 · 42.78 ms30,987 · 42.78 ms
Express18,722 req/s66.79 ms18,739 · 66.13 ms18,706 · 67.46 ms

GET /headers-prepared

A reusable header set after up-front validation.

GET
/headers-prepared
100
connections
2 × 6s
Runs

Throughput

higher is better

  1. swm-core162,836 req/s
  2. uWebSockets.js ref.164,283 req/s
  3. HyperExpress61,378 req/s
  4. micro32,408 req/s
  5. Fastify32,669 req/s
  6. Express18,545 req/s

p99 latency

lower is better

  1. swm-core11.94 ms
  2. uWebSockets.js ref.11.93 ms
  3. HyperExpress31.79 ms
  4. micro41.69 ms
  5. Fastify41.63 ms
  6. Express68.16 ms
GET /headers-prepared
ServerThroughput · medianp99 latency · medianrun 1run 2
swm-core162,836 req/s11.94 ms156,787 · 12.53 ms168,884 · 11.35 ms
uWebSockets.js ref.164,283 req/s11.93 ms163,183 · 12.05 ms165,382 · 11.81 ms
HyperExpress61,378 req/s31.79 ms59,692 · 32.42 ms63,063 · 31.16 ms
micro32,408 req/s41.69 ms32,720 · 45.4 ms32,097 · 37.99 ms
Fastify32,669 req/s41.63 ms32,253 · 44.51 ms33,085 · 38.75 ms
Express18,545 req/s68.16 ms18,248 · 70.18 ms18,841 · 66.13 ms

POST /base

Receive and parse a small JSON body.

POST
/base
100
connections
2 × 6s
Runs

Throughput

higher is better

  1. swm-core31,541 req/s
  2. uWebSockets.js ref.30,399 req/s
  3. HyperExpress22,454 req/s
  4. micro13,128 req/s
  5. Fastify11,255 req/s
  6. Express8,713 req/s

p99 latency

lower is better

  1. swm-core6.14 ms
  2. uWebSockets.js ref.6.39 ms
  3. HyperExpress8.60 ms
  4. micro14.39 ms
  5. Fastify23.16 ms
  6. Express19.3 ms
POST /base
ServerThroughput · medianp99 latency · medianrun 1run 2
swm-core31,541 req/s6.14 ms30,917 · 6.266 ms32,165 · 6.023 ms
uWebSockets.js ref.30,399 req/s6.39 ms29,950 · 6.519 ms30,848 · 6.266 ms
HyperExpress22,454 req/s8.60 ms22,040 · 8.774 ms22,869 · 8.433 ms
micro13,128 req/s14.39 ms13,199 · 14.4 ms13,058 · 14.4 ms
Fastify11,255 req/s23.16 ms11,082 · 23.62 ms11,427 · 22.7 ms
Express8,713 req/s19.3 ms8,935 · 21.39 ms8,491 · 17.2 ms

WebSocket / echo

Closed-loop ping-pong with a 64-byte message.

50
connections
2 × 6s
Runs

Throughput

higher is better

  1. swm-core48,330 msg/s
  2. uWebSockets.js ref.47,542 msg/s
  3. ws47,519 msg/s

p99 latency

lower is better

  1. swm-core1.738 ms
  2. uWebSockets.js ref.1.72 ms
  3. ws1.977 ms
WebSocket / echo
ServerThroughput · medianp99 latency · medianrun 1run 2
swm-core48,330 msg/s1.738 ms48,109 · 1.846 ms48,551 · 1.63 ms
uWebSockets.js ref.47,542 msg/s1.72 ms47,268 · 1.744 ms47,815 · 1.696 ms
ws47,519 msg/s1.977 ms49,388 · 1.855 ms45,650 · 2.099 ms

The native binding is measured separately

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

Binding: HTTP

The same synchronous GET over two native bindings.

GET
/base-sync
100
connections
4 × 6s
Runs

Throughput

higher is better

  1. swm-uws204,241 req/s
  2. uWebSockets.js ref.197,765 req/s

p99 latency

lower is better

  1. swm-uws9.50 ms
  2. uWebSockets.js ref.9.78 ms
Binding: HTTP
ServerThroughput · medianp99 latency · medianrun 1run 2run 3run 4
swm-uws204,241 req/s9.50 ms202,842 · 9.497 ms204,749 · 9.497 ms203,733 · 9.497 ms213,499 · 9.129 ms
uWebSockets.js ref.197,765 req/s9.78 ms195,375 · 10.08 ms203,544 · 9.497 ms197,709 · 9.881 ms197,821 · 9.687 ms

Binding: WebSocket

The same WebSocket echo over two native bindings.

50
connections
4 × 6s
Runs

Throughput

higher is better

  1. swm-uws44,124 msg/s
  2. uWebSockets.js ref.43,880 msg/s

p99 latency

lower is better

  1. swm-uws1.783 ms
  2. uWebSockets.js ref.1.861 ms
Binding: WebSocket
ServerThroughput · medianp99 latency · medianrun 1run 2run 3run 4
swm-uws44,124 msg/s1.783 ms44,579 · 1.767 ms44,830 · 1.799 ms43,668 · 1.824 ms43,578 · 1.714 ms
uWebSockets.js ref.43,880 msg/s1.861 ms44,502 · 1.886 ms44,662 · 1.907 ms43,258 · 1.712 ms43,162 · 1.837 ms

How to read the results

  1. 01

    The short tick marks the median. Dots show individual runs, while the line between them shows the spread.

  2. 02

    Higher throughput is better. Lower p99 is better. Values from different scenarios are not comparable.

  3. 03

    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.

commit
8e5b2672
synchronized
2026-07-25