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:
- 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).
- 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).
- 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
