Benchmarks

Measured, not marketed

Every number Moro publishes comes from a run you can repeat. Same app, same load generator, three engines. This page is the methodology, the raw output, and the command to reproduce it on your own hardware.

August 2026 · moro 1.8.7
109k
req/s, native engine, single process
742k
req/s pipelined ×10, clustered
0.9ms
avg latency at 100 connections
1.9ms
p99 latency, same run
The run

Three engines, one app

A hello-world JSON route scaffolded with init --fast, measured with wrk. The only difference between bars is the engine config line.

Requests per secondwrk · no pipelining
node engine
uWebSockets adapter
MoroJS Engine

August 2026 run on the hardware described below.

run summary · moro 1.8.7 · native engine
  wrk -c100 -d40s http://127.0.0.1:3000/   100 connections · 40 seconds · no pipelining   app: stock CLI scaffold · production mode    Latency avg     0.90ms   Latency p99     1.90ms   Requests/sec:  108,687
pipelined x10 microbench: 689k single process · 742k clusteredmeasured aug 2026
The data

The full table

Every row from the August 2026 results file: MoroJS configurations, other frameworks, and raw-server baselines, measured in one session on one machine.

ServerReq/sReq/s pipelined ×10Latency avgp99RSS under load
@morojs/engineraw111,325779,9350.9 ms1.8 ms47 MB
MoroJS + @morojs/engine · clustered109,144741,7190.9 ms1.7 ms1582 MB
MoroJS + @morojs/engine · single process108,687688,9800.9 ms1.9 ms65 MB
uWebSockets.jsraw107,935656,1550.9 ms1.7 ms43 MB
MoroJS + uWebSockets.js · adapter103,061527,0740.9 ms1.9 ms73 MB
Bun.serveraw99,61324,9701.0 ms3.0 ms29 MB
Elysia (Bun)98,13923,9161.0 ms2.5 ms41 MB
node:httpraw71,437116,1161.4 ms5.0 ms136 MB
MoroJS · node engine, single thread71,080124,5351.4 ms2.6 ms140 MB
Fastify68,880109,4921.4 ms4.2 ms139 MB
Elysia (Node adapter)65,034112,4271.5 ms2.7 ms207 MB
Hono (Node)64,758107,7571.5 ms2.9 ms200 MB
Koa (Node)59,69788,6061.7 ms4.8 ms204 MB
Express (Node)45,97665,9882.2 ms4.4 ms209 MB

Baselines are raw servers with no framework; they're the ceiling, not a competitor. Bun rows use Bun's own runtime. The pipelined ×10 column is a microbench that favors servers that batch aggressively. Read it as a ceiling, not a forecast.

Methodology

What we ran, and what we don't claim

Benchmarks are only useful if the setup is boring and public. Here's ours.

hardware

Apple M-series, darwin/arm64, node v24.11.0, mains power, no other foreground workloads. One machine for both app and load generator, which flatters nobody.

load

wrk, 100 connections, 40 seconds. Pipelined ×10 numbers come from a separate microbench and are always labeled as such.

app under test

The stock CLI scaffold, one JSON route, no logging, production mode. No hand-tuned special-case server.

what we don't claim

That you'll see these numbers behind your load balancer, or that hello-world predicts your workload. It measures framework overhead, nothing more.

Reproduce it

Run it yourself

Two commands and wrk. If your ordering comes out different, file an issue . We mean it.

$ npx @morojs/cli init bench-app --fast$ cd bench-app && NODE_ENV=production npm start$ wrk -c100 -d40s http://127.0.0.1:3000/