DEV Community

Claus Valca for M5 Dev

Posted on

The 2026 JS Desktop Runtime Showdown: Electron vs NW.js vs Neutralino vs Adrenaline

Hey everyone!

Instead of arguing about desktop framework bloat, we built an automated, reproducible benchmark harness (benchmarks/stress-suite/) and ran 5 major JavaScript desktop runtimes through the exact same heavy workload for 30s each on a 4-core AMD EPYC box under xvfb-run:

  • 10,000-record virtualized dataset with live regex search and column re-sorting.
  • 100 bidirectional JSON IPC packets/sec with high-resolution per-packet roundtrip tracking (hrtime).
  • 2 concurrent SHA-256 worker threads saturating the remaining CPU cores.

📊 Master Results (Sampled via /proc/[pid]/smaps_rollup PSS):

Metric Electron (v45) NW.js Neutralinojs Adrenaline (WebView) Adrenaline (CEF) Winner 🏆
Startup to Paint 394 ms 567 ms 530 ms 509 ms 382 ms Adrenaline (CEF) 🥇
Peak Stress PSS 717.3 MB 924.6 MB 486.4 MB 496.8 MB 439.4 MB Adrenaline (CEF) 🥇
Peak Private RAM 565.1 MB 732.7 MB 344.2 MB 346.3 MB 356.6 MB Neutralinojs
IPC p95 Latency 2.18 ms 2.54 ms 50.74 ms 5.50 ms 11.62 ms Electron
Shipped Payload 273.8 MB 510.8 MB 123.6 MB 121.1 MB 620.0 MB Adrenaline (WebView) 🥇
Process Count 11 procs 14 procs 10 procs 8 procs 6 procs Adrenaline (CEF) 🥇
Real Node / npm Yes Yes No (custom) Yes Yes —

🔍 Key Architectural Takeaways:

  1. Neutralino's IPC Bottleneck: Neutralino uses a local WebSocket server to bridge its backend, resulting in a 50.7ms p95 latency under load (vs 2.18ms for Electron and 5.5ms for Adrenaline's in-process C++ bridge).
  2. Chromium Memory Bloat: Under continuous mutation and background hashing, Electron and NW.js ballooned to 717MB and 924MB PSS, while Adrenaline (running a pruned, de-googled CEF engine) capped out at 439MB (-38.7% memory footprint).
  3. Distribution Size: Adrenaline (WebView mode) shipped the smallest runtime payload at 121MB (including the full Node.js binary), while Electron carries 274MB of bundled Chromium.

Full methodology, raw 350KB profiler trace, and process-by-process breakdowns are open-sourced in the repo:
🔗 GitHub: https://github.com/M5Devs/adrenaline

Top comments (0)