swm-core 5.1.0 / benchmark snapshot

swm-core benchmarks

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.

24.16.0
Node.js
Intel Xeon E5-2680 v4
processor
Linux x64
system
62.63 GiB
memory
14/08/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 p95/p99 tail latency are shown with ELU and RSS: a high request rate should not hide runtime cost.

GET /base-async

Short JSON response through an async handler.

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

Throughput

higher is better

  1. swm-core194,957 req/s
  2. uWebSockets.js ref.187,866 req/s
  3. HyperExpress66,594 req/s
  4. micro35,855 req/s
  5. Fastify36,734 req/s
  6. Express22,461 req/s

p99 latency

lower is better

  1. swm-core9.984 ms
  2. uWebSockets.js ref.10.29 ms
  3. HyperExpress29.11 ms
  4. micro41.19 ms
  5. Fastify35.82 ms
  6. Express54.3 ms
GET /base-async
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2
swm-core194,957 req/s5.244 ms9.984 ms98.74%80.65 MiB190,187 · 5.348 / 10.28 ms199,726 · 5.14 / 9.687 ms
uWebSockets.js ref.187,866 req/s5.582 ms10.29 ms98.77%81.67 MiB196,533 · 5.14 / 9.881 ms179,199 · 6.023 / 10.7 ms
HyperExpress66,594 req/s15.29 ms29.11 ms98.88%91.34 MiB69,851 · 14.68 / 27.67 ms63,336 · 15.89 / 30.55 ms
micro35,855 req/s29.73 ms41.19 ms98.98%123.33 MiB35,387 · 31.78 / 38.75 ms36,322 · 27.67 / 43.63 ms
Fastify36,734 req/s27.68 ms35.82 ms99.06%123.93 MiB37,594 · 27.13 / 34.4 ms35,874 · 28.22 / 37.24 ms
Express22,461 req/s47.7 ms54.3 ms99.07%125.03 MiB22,193 · 48.17 / 52.15 ms22,728 · 47.23 / 56.44 ms

GET /headers

Scalar response headers and repeated Set-Cookie values.

GET
/headers
100
connections
10
pipelining
2 × 6s
Runs

Throughput

higher is better

  1. swm-core132,414 req/s
  2. uWebSockets.js ref.147,641 req/s
  3. HyperExpress60,812 req/s
  4. micro32,381 req/s
  5. Fastify32,955 req/s
  6. Express18,635 req/s

p99 latency

lower is better

  1. swm-core14.4 ms
  2. uWebSockets.js ref.13.04 ms
  3. HyperExpress32.1 ms
  4. micro38.68 ms
  5. Fastify41.58 ms
  6. Express68.86 ms
GET /headers
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2
swm-core132,414 req/s8.40 ms14.4 ms98.81%81.23 MiB135,359 · 7.489 / 14.4 ms129,468 · 9.311 / 14.4 ms
uWebSockets.js ref.147,641 req/s7.063 ms13.04 ms98.79%81.76 MiB146,979 · 7.342 / 13.04 ms148,303 · 6.783 / 13.04 ms
HyperExpress60,812 req/s17.22 ms32.1 ms98.88%91.5 MiB61,622 · 16.54 / 31.78 ms60,002 · 17.9 / 32.42 ms
micro32,381 req/s32.45 ms38.68 ms99.03%140.72 MiB32,267 · 31.16 / 33.73 ms32,495 · 33.73 / 43.63 ms
Fastify32,955 req/s32.45 ms41.58 ms99.13%124.17 MiB32,674 · 33.73 / 43.63 ms33,236 · 31.16 / 39.52 ms
Express18,635 req/s59.34 ms68.86 ms99.07%123.93 MiB18,897 · 57.57 / 66.13 ms18,372 · 61.1 / 71.58 ms

GET /headers-prepared

A reusable header set after up-front validation.

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

Throughput

higher is better

  1. swm-core167,566 req/s
  2. uWebSockets.js ref.189,834 req/s
  3. HyperExpress59,461 req/s
  4. micro31,983 req/s
  5. Fastify32,849 req/s
  6. Express19,590 req/s

p99 latency

lower is better

  1. swm-core11.71 ms
  2. uWebSockets.js ref.10.18 ms
  3. HyperExpress32.74 ms
  4. micro33.41 ms
  5. Fastify43.26 ms
  6. Express66.82 ms
GET /headers-prepared
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2
swm-core167,566 req/s6.09 ms11.71 ms98.78%80.73 MiB159,478 · 6.391 / 12.29 ms175,653 · 5.789 / 11.13 ms
uWebSockets.js ref.189,834 req/s5.456 ms10.18 ms98.77%81.28 MiB189,953 · 5.348 / 10.28 ms189,715 · 5.564 / 10.08 ms
HyperExpress59,461 req/s17.38 ms32.74 ms98.89%93.57 MiB59,351 · 16.87 / 33.07 ms59,570 · 17.9 / 32.42 ms
micro31,983 req/s32.14 ms33.41 ms99.06%125.33 MiB33,588 · 30.55 / 32.42 ms30,378 · 33.73 / 34.4 ms
Fastify32,849 req/s32.45 ms43.26 ms98.94%122.89 MiB32,900 · 31.16 / 41.12 ms32,797 · 33.73 / 45.4 ms
Express19,590 req/s54.26 ms66.82 ms99.07%122.92 MiB19,512 · 55.34 / 68.81 ms19,667 · 53.19 / 64.84 ms

POST /base

Receive and parse a small JSON body.

POST
/base
100
connections
1
pipelining
2 × 6s
Runs

Throughput

higher is better

  1. swm-core34,498 req/s
  2. uWebSockets.js ref.32,704 req/s
  3. HyperExpress22,147 req/s
  4. micro13,349 req/s
  5. Fastify12,030 req/s
  6. Express9,154 req/s

p99 latency

lower is better

  1. swm-core5.565 ms
  2. uWebSockets.js ref.5.964 ms
  3. HyperExpress8.776 ms
  4. micro14.26 ms
  5. Fastify22.93 ms
  6. Express21.18 ms
POST /base
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2
swm-core34,498 req/s3.103 ms5.565 ms98.76%81.38 MiB34,982 · 3.133 / 5.455 ms34,014 · 3.072 / 5.675 ms
uWebSockets.js ref.32,704 req/s3.197 ms5.964 ms98.73%82.88 MiB33,158 · 3.133 / 5.905 ms32,249 · 3.26 / 6.023 ms
HyperExpress22,147 req/s4.657 ms8.776 ms98.73%141.81 MiB22,586 · 4.565 / 8.602 ms21,707 · 4.749 / 8.95 ms
micro13,349 req/s8.27 ms14.26 ms98.88%116.59 MiB12,939 · 8.433 / 14.68 ms13,759 · 8.106 / 13.84 ms
Fastify12,030 req/s9.689 ms22.93 ms98.9%260.81 MiB11,880 · 9.881 / 22.7 ms12,180 · 9.497 / 23.15 ms
Express9,154 req/s11.7 ms21.18 ms98.93%106.99 MiB9,053 · 12.05 / 21.39 ms9,255 · 11.35 / 20.97 ms

WebSocket / echo

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

50
connections
4
workers
2 × 6s
Runs

Throughput

higher is better

  1. swm-core101,414 msg/s
  2. uWebSockets.js ref.107,613 msg/s
  3. HyperExpress104,011 msg/s
  4. ws42,505 msg/s

p99 latency

lower is better

  1. swm-core0.927 ms
  2. uWebSockets.js ref.0.865 ms
  3. HyperExpress0.909 ms
  4. ws2.238 ms
WebSocket / echo
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2
swm-core101,414 msg/s0.891 ms0.927 ms98.06%67.3 MiB102,070 · 0.882 / 0.918 ms100,757 · 0.90 / 0.936 ms
uWebSockets.js ref.107,613 msg/s0.815 ms0.865 ms98.01%67.69 MiB107,068 · 0.815 / 0.865 ms108,158 · 0.815 / 0.865 ms
HyperExpress104,011 msg/s0.857 ms0.909 ms98.14%69.43 MiB105,131 · 0.848 / 0.90 ms102,891 · 0.865 / 0.918 ms
ws42,505 msg/s2.047 ms2.238 ms98.22%74.46 MiB41,934 · 2.067 / 2.282 ms43,075 · 2.027 / 2.194 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
10
pipelining
4 × 6s
Runs

Throughput

higher is better

  1. swm-uws219,044 req/s
  2. uWebSockets.js ref.211,768 req/s

p99 latency

lower is better

  1. swm-uws8.862 ms
  2. uWebSockets.js ref.8.95 ms
Binding: HTTP
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2run 3run 4
swm-uws219,044 req/s4.656 ms8.862 ms98.72%80.42 MiB220,784 · 4.656 / 8.774 ms210,582 · 4.844 / 9.311 ms221,469 · 4.656 / 8.774 ms217,304 · 4.656 / 8.95 ms
uWebSockets.js ref.211,768 req/s4.848 ms8.95 ms98.73%81.53 MiB217,243 · 4.656 / 8.95 ms226,947 · 4.475 / 8.602 ms206,293 · 5.789 / 8.95 ms203,693 · 5.04 / 9.497 ms

Binding: WebSocket

The same WebSocket echo over two native bindings.

50
connections
4
workers
4 × 6s
Runs

Throughput

higher is better

  1. swm-uws104,033 msg/s
  2. uWebSockets.js ref.102,967 msg/s

p99 latency

lower is better

  1. swm-uws0.90 ms
  2. uWebSockets.js ref.0.918 ms
Binding: WebSocket
ServerThroughput · medianp95 latency · medianp99 latency · medianELU · medianRSS · medianrun 1run 2run 3run 4
swm-uws104,033 msg/s0.857 ms0.90 ms97.98%67.17 MiB105,114 · 0.848 / 0.90 ms103,236 · 0.865 / 0.90 ms104,829 · 0.848 / 0.90 ms101,570 · 0.865 / 0.918 ms
uWebSockets.js ref.102,967 msg/s0.865 ms0.918 ms98.09%67.86 MiB102,945 · 0.865 / 0.918 ms101,748 · 0.882 / 0.936 ms102,988 · 0.865 / 0.90 ms103,628 · 0.848 / 0.918 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 p95, p99, and RSS are better. ELU describes event-loop saturation rather than a standalone ranking.

  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
4ee4fa3e
synchronized
2026-08-15