Runtime benchmarks are mostly bullshit. I learned this when my Bun migration crashed every 20 minutes with SIGSEGV
errors.
Bun is genuinely faster - my Express API went from 8k RPS to 24k RPS on the same hardware. But speed means nothing when your process randomly dies with no useful error message. Bun 1.2.0 fixed most stability issues, but you're still beta testing for them. The JavaScriptCore engine has better memory performance than V8 in many cases - when it doesn't segfault.
Deno 2.0 is the adult in the room now - stable, predictable, and only 20% slower than Node.js in real-world HTTP workloads. The TypeScript support is legitimately amazing: no build step, no config files, just works. But good luck explaining the permission system to your DevOps team.
Node.js 22 just works - boring, reliable, and every monitoring tool knows how to profile it. It's the runtime equivalent of a Toyota Camry: not exciting, but it starts every morning. The V8 engine optimizations continue improving performance steadily.
Bun consistently outperforms Node.js by 3x in HTTP benchmarks, but these numbers mean nothing when your app crashes due to compatibility issues. I spent my entire Saturday debugging this shit.
Why JavaScriptCore Will Ruin Your Weekend
Bun's JavaScriptCore engine sounds great on paper - better memory usage, faster cold starts. In practice, you'll spend hours debugging weird edge cases because 99% of JavaScript was written for V8.
I hit this with the `crypto` module: Node.js code that worked fine for 2 years suddenly started throwing ERR_CRYPTO_INVALID_STATE
errors in Bun 1.1.8. The fix? Completely rewrite the crypto logic because JavaScriptCore handles buffer initialization differently than V8. Took me 6 hours and a lot of swearing. Check Bun's compatibility issues - you'll find way more pain than I signed up for.
V8 has 15 years of weird edge cases that every npm package was built around. V8's quirks are documented in millions of Stack Overflow posts. JavaScriptCore is technically cleaner but breaks shit that worked fine for years. The WebKit team optimizes for Safari, not server workloads where you need to run for months without crashes.
Deno's built-in TypeScript compiler eliminates the build step entirely - you write .ts
files and Deno executes them directly. No webpack, no tsc, no config files.
TypeScript: The Good, Bad, and Ugly
Bun just runs .ts
files without transpilation, which feels like black magic until you need to debug type errors and realize there's no source maps. Made me want to chuck my laptop out the window.
Deno's TypeScript is perfect when it works. The type checker is strict as hell, which means every slightly loose npm package throws 200 type errors. You'll either love it or develop an eye twitch.
Node.js with TypeScript is predictable pain. Everyone knows how to set up tsc, everyone's debugger works, and Stack Overflow has answers for everything.
Deno Security is Annoying as Hell
Deno's permission system is brilliant in theory. In practice, you'll type --allow-all
and defeat the entire security model because debugging which permission you need is a nightmare.
## What you want to type:
deno run app.ts
## What you actually type after 30 minutes:
deno run --allow-all --allow-read --allow-write --allow-net --allow-env --allow-run app.ts
Node.js and Bun give your app full system access, which is terrifying but honest. At least you know what you're getting.
The real performance battle is between shipping features and fighting runtime quirks. Speed is meaningless if you're debugging crashes at 3am.