Spent the last month benchmarking all three runtimes on actual projects, not synthetic hello-world apps. Here's what broke, what worked, and what made me question my life choices.
The Reality Check: Bun Edition
Bun is fast as hell - legitimately fast. Our Express API that normally handles 8k RPS in Node hit 18k RPS in Bun without any code changes. Memory usage dropped from 180MB to 95MB for the same workload.
But here's the shit they don't tell you:
- Windows support is garbage. Spent 3 hours debugging why our CI kept failing - turns out Bun's file watching just doesn't work properly on Windows Server 2022
- Random crashes with
prisma generate
that only happen in Docker containers - documented issue but no real fix. Error message:Segmentation fault: 11
with no stack trace. Happens on Alpine Linux but works fine on Ubuntu base images. Prisma 5.9.1 + Bun 1.1.34 = guaranteed headache. node_modules
compatibility is "99%" until you hit that 1% that breaks your entire deploy - check Bun compatibility before migrating
The Bun GitHub issues page is full of similar production problems. Performance benchmarks look amazing until you're debugging at 3 AM.
Source: Our production metrics from migrating [internal API] - can share Docker configs
Deno 2.0: Actually Usable Now
Deno 2.0 finally fixed the npm compatibility disaster from v1. Migrated a Next.js API route to Deno Deploy in about 2 hours - it just worked.
Performance is solid: 12k RPS vs Node's 8k on the same workload. Not Bun-level fast, but way more predictable.
The good:
- TypeScript support just works out of the box - no build step bullshit
- Permissions system caught 2 security issues I didn't even know about
- Deploy to Deno Deploy is stupidly simple (when it works)
- Web Standards API support means less polyfill hell
The annoying:
- Still occasionally breaks on complex npm packages (looking at you, `sharp`)
- Learning curve for the permission flags made me want to go back to PHP
- JSR package registry still smaller than npm ecosystem, though growing fast
Node.js: Boring and Reliable
Node 22 is boring. Node 23 is more boring. Experimental TypeScript support in 22.6.0+ means you can run TS files directly, but it's slower than just using tsx.
Performance? Same as always - decent but not exciting. 8-10k RPS for most workloads, memory usage is predictable around 150-200MB.
Why it's still my go-to:
- When production breaks at 3 AM, Stack Overflow has 47 answers for your exact error
- npm packages just work (revolutionary concept)
- Your DevOps team already knows how to deploy it
- Node.js documentation is comprehensive and actually maintained
- LTS support means no surprise breaking changes
- Enterprise support available from multiple vendors
Production Reality: Speed vs Staying Employed
Benchmarks lie. Our checkout API showed these numbers under real Black Friday load:
- Node.js: Handled the traffic, needed 3 extra instances
- Deno: Handled it fine, confusing error logs when things went sideways
- Bun: Melted down spectacularly, took 20 minutes to figure out why
Raw speed means nothing if you can't debug it when it breaks.