We benchmarked TriFrost against Elysia, Hono, Koa, and Express in a head-to-head hello world shootout. The results? Frosty.
Benchmarks are hard to get right β but when done cleanly, even a simple hello world benchmark can tell you a lot about how a framework thinks.
So, we decided to do one.
The Contestants
We set up five microservers β all returning plain text at GET /
β running on the same machine, same environment, no extra middleware:
- TriFrost: the runtime-flexible underdog
- Elysia: the Bun-native speedster
- Hono: designed for edge, fast and light
- Koa: the classic composable
- Express: the reliable legacy giant
All were tested using autocannon on bun with the following parameters:
- 100 concurrent connections
- pipelining of 10
- 10 seconds duration
autocannon -c 100 -d 10 -p 10 http://localhost:<port>
The Results (Avg RPS + Latency)
- TriFrost β π’ 151,194 req/sec @ 6.11ms
- Hono β 140,832 req/sec @ 6.63ms
- Elysia β 138,378 req/sec @ 6.77ms
- Koa β 133,968 req/sec @ 6.99ms
- Express β π΄ 103,482 req/sec @ 9.19ms
Full Results
π¬ Benchmarking TriFrost at http://localhost:3001
βββββββββββ¬βββββββ¬βββββββ¬ββββββββ¬ββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββ
β Stat β 2.5% β 50% β 97.5% β 99% β Avg β Stdev β Max β
βββββββββββΌβββββββΌβββββββΌββββββββΌββββββββΌββββββββββΌββββββββββΌββββββββ€
β Latency β 4 ms β 5 ms β 12 ms β 13 ms β 6.11 ms β 2.53 ms β 80 ms β
βββββββββββ΄βββββββ΄βββββββ΄ββββββββ΄ββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββ
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββββ¬ββββββββββ¬ββββββββββ
β Stat β 1% β 2.5% β 50% β 97.5% β Avg β Stdev β Min β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββΌββββββββββ€
β Req/Sec β 139,007 β 139,007 β 152,319 β 157,695 β 151,193.6 β 6,112.2 β 138,930 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββΌββββββββββ€
β Bytes/Sec β 15.7 MB β 15.7 MB β 17.2 MB β 17.8 MB β 17.1 MB β 692 kB β 15.7 MB β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββββ΄ββββββββββ΄ββββββββββ
Req/Bytes counts sampled once per second.
# of samples: 10
1513k requests in 10.04s, 171 MB read
π¬ Benchmarking Elysia at http://localhost:3002
βββββββββββ¬βββββββ¬βββββββ¬ββββββββ¬βββββββ¬ββββββββββ¬ββββββββββ¬ββββββββ
β Stat β 2.5% β 50% β 97.5% β 99% β Avg β Stdev β Max β
βββββββββββΌβββββββΌβββββββΌββββββββΌβββββββΌββββββββββΌββββββββββΌββββββββ€
β Latency β 6 ms β 7 ms β 8 ms β 9 ms β 6.77 ms β 0.97 ms β 25 ms β
βββββββββββ΄βββββββ΄βββββββ΄ββββββββ΄βββββββ΄ββββββββββ΄ββββββββββ΄ββββββββ
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββββ¬βββββββββββ¬ββββββββββ
β Stat β 1% β 2.5% β 50% β 97.5% β Avg β Stdev β Min β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌβββββββββββΌββββββββββ€
β Req/Sec β 130,623 β 130,623 β 138,879 β 145,919 β 138,377.6 β 3,635.92 β 130,560 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌβββββββββββΌββββββββββ€
β Bytes/Sec β 16.6 MB β 16.6 MB β 17.6 MB β 18.5 MB β 17.6 MB β 462 kB β 16.6 MB β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββββ΄βββββββββββ΄ββββββββββ
Req/Bytes counts sampled once per second.
# of samples: 10
1385k requests in 10.05s, 176 MB read
π¬ Benchmarking Hono at http://localhost:3003
βββββββββββ¬βββββββ¬βββββββ¬ββββββββ¬ββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ
β Stat β 2.5% β 50% β 97.5% β 99% β Avg β Stdev β Max β
βββββββββββΌβββββββΌβββββββΌββββββββΌββββββββΌββββββββββΌβββββββββΌββββββββ€
β Latency β 5 ms β 6 ms β 11 ms β 13 ms β 6.63 ms β 1.4 ms β 30 ms β
βββββββββββ΄βββββββ΄βββββββ΄ββββββββ΄ββββββββ΄ββββββββββ΄βββββββββ΄ββββββββ
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββββ¬ββββββββββ
β Stat β 1% β 2.5% β 50% β 97.5% β Avg β Stdev β Min β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββ€
β Req/Sec β 115,711 β 115,711 β 144,895 β 151,935 β 140,832 β 11,149.61 β 115,710 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββ€
β Bytes/Sec β 14.7 MB β 14.7 MB β 18.4 MB β 19.3 MB β 17.9 MB β 1.42 MB β 14.7 MB β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββββ΄ββββββββββ
Req/Bytes counts sampled once per second.
# of samples: 10
1409k requests in 10.05s, 179 MB read
π¬ Benchmarking Koa at http://localhost:3004
βββββββββββ¬βββββββ¬βββββββ¬ββββββββ¬ββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββ
β Stat β 2.5% β 50% β 97.5% β 99% β Avg β Stdev β Max β
βββββββββββΌβββββββΌβββββββΌββββββββΌββββββββΌββββββββββΌββββββββββΌββββββββ€
β Latency β 3 ms β 7 ms β 13 ms β 15 ms β 6.99 ms β 2.68 ms β 42 ms β
βββββββββββ΄βββββββ΄βββββββ΄ββββββββ΄ββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββ
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββββ¬ββββββββββ
β Stat β 1% β 2.5% β 50% β 97.5% β Avg β Stdev β Min β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββ€
β Req/Sec β 105,087 β 105,087 β 135,935 β 141,695 β 133,968 β 10,075.64 β 105,050 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌββββββββββ€
β Bytes/Sec β 13.5 MB β 13.5 MB β 17.4 MB β 18.1 MB β 17.1 MB β 1.29 MB β 13.4 MB β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββββ΄ββββββββββ
Req/Bytes counts sampled once per second.
# of samples: 10
1341k requests in 10.04s, 171 MB read
π¬ Benchmarking Express at http://localhost:3005
βββββββββββ¬βββββββ¬βββββββ¬ββββββββ¬ββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββ
β Stat β 2.5% β 50% β 97.5% β 99% β Avg β Stdev β Max β
βββββββββββΌβββββββΌβββββββΌββββββββΌββββββββΌββββββββββΌββββββββββΌββββββββ€
β Latency β 7 ms β 9 ms β 17 ms β 18 ms β 9.19 ms β 2.11 ms β 31 ms β
βββββββββββ΄βββββββ΄βββββββ΄ββββββββ΄ββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββ
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββββ¬βββββββββββ¬ββββββββββ
β Stat β 1% β 2.5% β 50% β 97.5% β Avg β Stdev β Min β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌβββββββββββΌββββββββββ€
β Req/Sec β 101,887 β 101,887 β 102,399 β 107,711 β 103,481.6 β 1,871.21 β 101,870 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββΌβββββββββββΌββββββββββ€
β Bytes/Sec β 19.5 MB β 19.5 MB β 19.6 MB β 20.6 MB β 19.8 MB β 358 kB β 19.5 MB β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββββ΄βββββββββββ΄ββββββββββ
Req/Bytes counts sampled once per second.
# of samples: 10
1036k requests in 10.01s, 198 MB read
Takeaways
- TriFrost leads the pack, even against Bun-optimized frameworks.
- Hono and Elysia are fast, but not faster.
- Koa holds up surprisingly well, considering its age.
- Express is fine β but shows its years.
So What?
We donβt believe in benchmark theater. But we do believe in tight paths, predictable async, and no overhead abstractions. And thatβs exactly what TriFrost brings to the table.
No black boxes. No magic.
Just fast.
Want to run it yourself? The benchmark suite is open source. Clone it, run it, tweak it.
Stay frosty. βοΈ