Independent, verifiable performance testing using industry-standard tools. MoroJS ships its own native C++ engine (@morojs/engine) as the default transport — measured here from the published npm packages. All benchmarks are reproducible with one command.
Moro's own native C++ engine (@morojs/engine), the default transport, zero config.
• Native C++ engine, same Moro API
• Beats uWebSockets.js in both profiles
• Lowest latency (p99 1.6ms)
Built-in clustering with auto worker management.
• Same native engine × auto workers
• SO_REUSEPORT load distribution
• Scales across all CPU cores
Pure Node http server, the automatic fallback wherever a prebuilt engine binary isn't available.
• No native binary required
• Automatic, nothing fails to boot
• Matches raw node:http throughput
Every framework measured on the same machine, same session, same tool no cross-sourcing. Two profiles: real-world (no pipelining, the headline how real HTTP clients behave) and pipelined ×10. Full data + methodology in the benchmark repo.
| Framework | Req/sec real-world | Pipelined ×10 | Latency | Runtime |
|---|---|---|---|---|
| MoroJS - clustered (engine × all cores) | 103,971 | 584,016 | 0.9ms | Node 24 |
| MoroJS - Moro Engine (default) | 102,409 | 572,053 | 0.9ms | Node 24 |
| MoroJS + uWebSockets.js (opt-in) | 101,237 | 520,799 | 0.9ms | Node 24 |
| Elysia | 96,717 | 18,690 | 1.0ms | Bun |
| Fastify | 69,375 | 117,069 | 1.4ms | Node 24 |
| MoroJS - Node.js path (fallback) | 68,163 | 119,570 | 1.4ms | Node 24 |
| Elysia (Node adapter) | 66,786 | 115,798 | 1.5ms | Node 24 |
| Koa | 60,924 | 93,903 | 1.6ms | Node 24 |
| Hono | 56,926 | 100,278 | 1.4ms | Node 24 |
| Express | 47,279 | 69,540 | 2.1ms | Node 24 |
node bench.js <target> --pipelined.These measure framework overhead, not your app. Your real numbers ride on your database, your I/O, and your business logic. What they do prove: MoroJS adds almost nothing on top of the transport it runs on. And every row is one command to reproduce - so don't take our word for it, run it.
git clone https://github.com/Moro-JS/benchmark.git
cd benchmark && npm install
# Moro Engine (the default) both profiles, best-of-3
node bench.js engine --pipelined
# Clustered / Node path / competitors
node bench.js cluster single fastify express koa --pipelined
# Everything, saved to a results-<timestamp>.md
npm run bench:save
Each run boots the server, waits for readiness, asserts the intended engine actually loaded, runs the load generator (a separate native process), samples memory, tears down, and cools down before the next target.
Quick sanity runs: npm run bench:quick (10s — never published). Raw baselines: node bench.js raw-engine raw-uws raw-node.