Benchmarks
Workload: the todos REST API (HTTP + SQLite) — examples/todos-http-sqlite.tsm —
with the identical API implemented for Node.js, Bun and Go. Load generated with wrk on
loopback on a Vultr vc2-1c-1gb instance (1 vCPU Xeon Cascadelake, Ubuntu 24.04).
Marina v0.2.0 evented build, AOT binary 2.5 MB. Benchmarked 2026-10-19.
Per runtime: fresh SQLite DB (10 seeded rows) → 10 s warmup → 30 swrk -t4 -c64GET → 20 swrk -t4 -c64POST. RSS sampled every 50–100 ms.
GET req/s · higher is better
wrk -t4 -c64 · 30 seconds — bars scaled to the fastest runtime
Total requests in 30 s — Marina: 333,580, Bun: 597,567, Go: 317,317, Node: 305,387
POST req/s · higher is better
wrk -t4 -c64 · 20 seconds — each request inserts a row into SQLite, with JSON body validation
resident set lower is better
Idle RSS at startup and peak RSS under the c=64 load — bars scaled to the heaviest runtime
Latency (GET, c=64)
p50 / p99 in milliseconds — Marina's p99 beats both Go and Node.js
| Runtime | p50 | p99 |
|---|---|---|
| Marina 0.2 (evented) | 5.71 ms | 10.02 ms |
| Bun 1.4.3 | 3.03 ms | 6.72 ms |
| Go 1.23 | 7.22 ms | 55.27 ms |
| Node.js 22.23 | 5.82 ms | 15.19 ms |
concurrency sweep flat, no collapse
GET /todos — 5 s per point, req/s at each connection level
Takeaways
Bun wins raw GET throughput (~19.9k req/s), but the evented Marina build sits in the same league as Go and Node — 11.1k req/s at c=64 with a tighter p99 than both, and 1,400 POST req/s (write + validation), beating Bun and Node on writes.
The headline is memory: Marina's AOT binary idles at 4.2 MB and peaks at 7.1 MB — a third of Go's peak, and roughly 12× lighter than Node.js.