Pobierz PDF

The Next Generation of Server-Side JavaScript Runtimes: Node.js, Deno and Bun

Metadane

  • Autorzy: Juuso Laakso
  • Rok: 2025
  • Źródło: Bachelor’s Thesis UAS, Turku University of Applied Sciences (Turku AMK), Business Information Technology
  • URL: http://www.theseus.fi/bitstream/10024/905982/2/Laakso_Juuso.pdf
  • Strony: 43
  • Status: read
  • Kategoria główna: Systems
  • Podkategorie: JavaScript Runtimes, Benchmarking, Performance, Software Engineering
  • Tagi: #javascript #nodejs #deno #bun #runtime #benchmark #performance #typescript #serverless #edge-computing #project:js-runtime-energy

Streszczenie

Praca licencjacka badająca ewolucję i przyszłość serwerowych środowisk uruchomieniowych JavaScript — Node.js, Deno i Bun. Łączy przegląd literatury z praktycznymi benchmarkami (MacBook Air M2, 16GB) w 4 kategoriach: HTTP throughput, File I/O, JSON stringify/parse, CPU-bound operations.

Kluczowe wnioski: Bun konsekwentnie dominuje we wszystkich benchmarkach (JavaScriptCore engine, napisany w Zig), Deno przy native API osiąga poziom Node.js (V8, Rust/Tokio), brak jednej “najlepszej” opcji — wybór zależy od priorytetów projektu. State of JavaScript 2024: Node.js 90.8%, Bun 16.4%, Deno 11.8% użycia.

Ważne zastrzeżenie: To praca licencjacka (UAS), nie recenzowany artykuł naukowy. Metodologia benchmarkingu jest uproszczona (10 powtórzeń, best result). Dane traktować jako punkt wyjścia, nie jako autorytatywne wyniki badań.


Kluczowe Wnioski

  • Bun lider wydajności we wszystkich testach: HTTP (+42% vs Node.js), File I/O (-32% czasu), JSON (-49% czasu), CPU-bound (-34% czasu)
  • Deno ≈ Node.js przy native API; overhead kompatybilności Node.js w Deno widoczny w HTTP (-16% vs Node.js przy node:http API)
  • JavaScriptCore (Bun) vs V8 (Node.js, Deno): różne silniki JS to kluczowy czynnik wydajności
  • Bun 1.2 (Jan 2025): 99% kompatybilności z Node.js API → drop-in replacement możliwy
  • Deno 2 (Oct 2024): NPM specifiers, lepsza kompatybilność z ekosystemem Node.js
  • State of JavaScript 2024 (11,576 respondentów): Node.js 90.8%, Browser 83.2%, Bun 16.4%, Service Workers 15.6%, Deno 11.8%
  • Deno: bezpieczeństwo-first (permission model —allow-*), ale overhead sprawdzania uprawnień minimalny dla większości workloadów
  • Bun: napisany w Zig (low-level, manual memory mgmt, max speed), 20× szybszy package manager vs NPM

Metodologia (benchmarki)

Środowisko: MacBook Air M2 (Apple Silicon), 16GB RAM, brak aplikacji w tle

Protokół (nieformalne): 10 powtórzeń na test, zapisywany najlepszy wynik

Narzędzie HTTP: autocannon (NPM package), 10 klientów, 10 sekund

Testy:

  1. HTTP requests/sec — simple JSON server (node:http API)
  2. HTTP requests/sec — Deno native API (Deno.serve)
  3. File I/O — 1000 plików po 1KB (read + write)
  4. JSON — stringify + parse obiektów user data (wiele iteracji)
  5. CPU-bound — Fibonacci(35) + sort array (100 przebiegów)

Ograniczenia: Best-of-10 (nie median), Apple M2 (JavaScriptCore = silnik Safari = Bun na własnym podwórku?), bez izolacji procesów, bez PowerJoular/energii.


Główne Koncepcje

  • Node.js: Created 2009 by Ryan Dahl; V8 engine (Google); event-driven non-blocking I/O; NPM ecosystem (largest package registry); C++ core
  • Deno: Created 2020 by Ryan Dahl; V8 engine; Rust + Tokio async runtime; permission-based sandbox (—allow-read/write/net/env); native TypeScript; URL imports → JSR (2025)
  • Bun: Created 2021 by Jarred Sumner (Oven.sh); JavaScriptCore (Apple Safari engine); Zig language; built-in test runner, bundler, transpiler, package manager; 99% Node.js API compat (v1.2)
  • JavaScriptCore vs V8: Apple Safari vs Google Chrome engine — różne charakterystyki JIT compilation → Bun ma inne (często lepsze) performance profile
  • Zig: Low-level systems language — manual memory management, brak GC overhead, kompiluje do native code
  • JSR (JavaScript Registry): Nowy rejestr Deno (2025) — TypeScript-first, type-checked packages, alternatywa dla NPM
  • Deno.serve API: Natywne HTTP API Deno (vs kompatybilność node:http) — wyraźnie szybsze, bo brak warstwy translacji
  • PLATYPUS mitigation: Kernel ograniczył RAPL access — nie wspomniany w tej pracy (brak pomiaru energii)

Wyniki (dane liczbowe)

HTTP Requests per Second (autocannon, 10 clients, 10s):

Runtimenode:http APINative API
Bun103,821103,821
Node.js73,00973,009
Deno61,44672,941

Deno native API (Deno.serve) ≈ Node.js (73,009 vs 72,941).

File I/O (1000 plików, 1KB each):

RuntimeRead [ms]Write [ms]Total [ms]
Bun8.5128.4837.67
Node.js18.2647.2855.86
Deno9.0554.0772.49

Uwaga: Deno wolny zapis (54ms) vs szybki odczyt (9ms) — prawdopodobnie overhead uprawnień przy write.

JSON Stringify + Parse:

RuntimeStringify [s]Parse [s]Total [s]
Bun1.803.805.60
Deno2.055.497.53
Node.js4.806.1910.99

JSON: Bun > Deno > Node.js — Deno i Bun oba lepsze od Node.js.

CPU-bound (Fibonacci 35 + sort 100×):

RuntimeFibonacci [ms]Sort 100× [ms]Total [ms]
Bun44.22146.34190.57
Node.js67.68219.71287.49
Deno68.16237.33305.57

CPU: Bun wyraźnie szybszy (JavaScriptCore), Node.js ≈ Deno (oba V8).


Przydatne Cytaty

“Node.js remains the established industry standard, its position earned through a long track record of use, a vast and mature ecosystem, and a large global talent pool.” (Chapter 6)

“Bun has clearly established itself as the clear leader in performance, consistently outperforming both Node.js and Deno across benchmarks.” (Chapter 6)

“Deno started from a direct critique of Node.js’s original design, successfully delivering on its promise of a more secure by default and modern development experience.” (Chapter 6)

“Bun 1.2 had achieved ninety-nine percent compatibility with Node.js built-in modules.” (Section 2.4, citing Partovi 2025)

“The results show that Bun could achieve startup times approximately three times faster than Node.js.” (Section 2.4, citing Ahmod 2023)

“Can runtime-level performance continue improving, or are gains primarily limited by the underlying JavaScript engines (V8, JavaScriptCore)?” (Section 6.1 Future Work)


Datasety


Powiązane Tematy

  • Kontekst dla JE-2 (Bun vs Deno vs Node.js wydajność): benchmark data jako punkt wyjścia
  • Gap energetyczny (bezpośredni): praca nie mierzy energii — luka badawcza JE-1 identyczna z naszą tezą
  • JavaScriptCore vs V8 → hipoteza: Bun może być energetycznie efektywniejszy dzięki różnemu engine (ale M2 = Apple Silicon = JavaScriptCore advantage na własnej platformie)
  • Deno native API vs node:http compatibility layer → implikacja: benchmarki muszą używać native API każdego runtime, nie wspólnego compatibility wrapper
  • Future work w tej pracy → dokładnie pytania badawcze projektu js-runtime-energy: energy, długoterminowa stabilność, production case studies
  • Albonico 2025 — analogiczna metodologia (ale brak energii w Laakso); wzorzec do ulepszenia
  • Smirnov 2024 (w references/) — podobny zakres porównania, prawdopodobnie rosyjski journal

Notatki

Praca licencjacka (nie peer-reviewed). Użyj danych jako punktu odniesienia dla benchmark design i jako motywację dla energy gap. Cytuj jako “grey literature” lub unikaj cytowania w favor of peer-reviewed sources (Ahmod 2023, Smirnov 2024).

Elementów w folderze: 0.