Wyniki
Niniejsza sekcja przedstawia wyniki eksperymentów przeprowadzonych na \textbf{dwóch
niezależnych platformach sprzętowych}: P1~— Intel Core i7-6700 (Skylake, 2015,
Ubuntu 24.04.4 LTS) oraz P2~— Intel Xeon E-2176G (Coffee Lake, 2018, Ubuntu 24.04.3 LTS).
Obie platformy użyły identycznych wersji runtimeów (Node.jsv24.15.0, Deno2.8.1,
Bun1.3.14) i identycznego protokołu pomiarowego: powtórzeń per konfiguracja
po30 iteracjach rozgrzewki. Platforma P2 dodatkowo eksponuje domenę RAPL DRAM
(intel-rapl:0:2), niedostępną na P1. Łącznie zebrano
pomiarów głównych. Sekcja zorganizowana jest według pytań badawczych: RQ1
([→]), RQ2–RQ3 ([→]), RQ4 ([→]),
RQ5 ([→]), RQ6 — walidacja cross-platform ([→]).
RQ1: Protokół Pomiaru Energii — Warm-up JIT i Skoki GC
Eksperyment JE-EXP-2 zbadał wpływ rozgrzewki JIT na stabilność pomiarów energii, mierząc 100 kolejnych wywołań workloadu CPU-bound (SHA-256 hashing) bez restartu procesu.
\centering \small Wyniki protokołu warm-up JIT (#JE-EXP-2). $N_{\text{warm-up iteracji do stabilizacji energetycznej; GC — liczba wykrytych skoków; GC~[%] — procentowy wpływ na medianę bez filtrowania.}
| Runtime | | Wykryte skoki GC | Wpływ GC na medianę [%] |
| Node.js v24.15.0 | 30 | 5 | 0{,}1 | | Deno 2.8.1 | 30 | 3 | 0{,}0 | | Bun 1.3.14 | 30 | 5 | 0{,}0 |
Wyniki (Tabela~[→]) wskazują, że wszystkie trzy środowiska uruchomieniowe wymagają~ iteracji przed stabilizacją zużycia energii. Jest to wartość wyższa niż sugerowane w literaturze – dla V8 w warunkach mikro-benchmarków~1, co wynika z faktu, że workload SHA-256 z buforem 64~KB aktywuje wyższy poziom optymalizacji JIT (Turbofan tier) dopiero po wielokrotnym wykonaniu. Wpływ skoków GC na medianę energii jest znikomy () dla wszystkich runtimeów — co wskazuje na niski poziom presji na Garbage Collector przy izolowanym workloadzie bez alokacji długożyjących obiektów.
Odpowiedź na RQ1: Rzetelny pomiar energii JS runtimeów wymaga co najmniej iteracji rozgrzewania dla V8 (Node.js, Deno) i JavaScriptCore (Bun) przy workloadach intensywnych obliczeniowo. Wpływ skoków GC jest pomijalny dla badanych workloadów, ale protokół filtrowania (IQR~) pozostaje rekomendowany jako środek ostrożności dla workloadów z dużą alokacją obiektów.
RQ2–RQ3: Porównanie Energetyczne Node.js, Deno i Bun
Eksperyment JE-EXP-1 zmierzył zużycie energii pakietu CPU (domena RAPL Package)
dla 6kategorii workloadów serverless przy 50 powtórzeniach per konfiguracja.
Domena PP0 Core stanowiła konsekwentnie – energii pakietu
we wszystkich konfiguracjach, co wskazuje na dominujący udział rdzeni obliczeniowych;
domena Uncore (PP1) zwróciła wartość zerową na badanej platformie(i7-6700, Skylake),
ponieważ procesor ten nie eksponuje oddzielnego licznika Uncore w sysfs
(intel-rapl:0:1~=0J we wszystkich pomiarach).
\centering \small \caption{Mediana energii pakietu CPU~[J] per workload i runtime (#JE-EXP-1, ). Pogrubiono wartość minimalną (najlepszą) w każdym wierszu. — różnica względna Bun vs Node.js [%].}
| Workload | Node.js~[J] | Deno~[J] | Bun~[J] | ~[%] |
| CPU-bound | 44{,}05 | 43{,}48 | **29{,**85} | | | I/O-bound | 17{,}36 | 14{,}07 | **4{,**52} | | | Mixed REST | 2{,}20 | 1{,}81 | **1{,**59} | | | Memory | 135{,}37 | **112{,**20} | 133{,}04 | | | SSR | **1{,**50} | 1{,}62 | 1{,}74 | | | Cold start | 0{,}60 | 0{,}64 | **0{,**31} | |
Tabela~[→] zbiera mediany energii dla wszystkich konfiguracji.
Wszystkie różnice między parami runtimeów są istotne statystycznie (,
test Mann-Whitney U, ) z dużym rozmiarem efektu (Cohen’s
dla wszystkich par we wszystkich workloadach). Przy 18konfiguracjach i2testach parami
wykonano łącznie 36porównań; korekta Bonferroniego daje próg ,
który jest spełniony przez wszystkie pary (), co potwierdza robustność
wniosków wobec wielokrotnych porównań.
Workload CPU-bound.
Bun zużył J mediany energii pakietu, co stanowi redukcję o względem
Node.js (J) i względem Deno (~J). Różnica między Node.js
a Deno jest mniejsza — wynosi — i jest statystycznie istotna (),
lecz nieistotna praktycznie. Wynik potwierdza hipotezę H1: JavaScriptCore (Bun)
jest energetycznie bardziej efektywny niż V8 (Node.js, Deno) dla synchronicznych
workloadów obliczeniowych.
Workload I/O-bound.
Najsilniejsza z obserwowanych różnic: Bun zużył J, czyli o mniej niż
Node.js (J) i mniej niż Deno (+~natywne API systemowe w Bun jest energetycznie znacznie efektywniejsza
niż warstwa J). Deno z kolei
jest o lepszy od Node.js (). Tak duże różnice przy workloadzie
I/O-bound wskazują, że implementacja asynchronicznego we/wy przez
JavaScriptCorelibuv w Node.js, zaś asynchroniczny runtime Tokio/Rust w Deno
osiąga pośredni wynik.
Workload Memory-bound.
Wynik odbiega od ogólnego trendu: Deno (J) jest o lepszy od
Node.js (~J), natomiast Bun (~J) jest porównywalny do Node.js
(, różnica ). Wynik sugeruje, że implementacja operacji na
dużych tablicach w V8 (Node.js, Deno) wykazuje zróżnicowaną efektywność: Deno
korzysta prawdopodobnie z agresywniejszych optymalizacji JIT dla operacji tablicowych
przy długich sesjach, podczas gdy Bun nie uzyskuje tutaj przewagi JavaScriptCore.
Workload SSR.
Jedyna kategoria, w której Node.js jest liderem energetycznym: ~J vs
J (Deno, ) vs 2.J (Bun, ). Workload SSR obejmuje
renderowanie szablonów zintensywnym przetwarzaniem ciągów znakowych, w którym
silnik V8 (Node.js) osiąga przewagę nad JavaScriptCore przy długich łańcuchach
transformacji — co koresponduje z wynikami benchmarków wydajnościowych
Laakso
Cold start.
Bun zużył J na zimny start — o mniej niż Node.js (J)
i mniej niż Deno (~J). Niższa energia zimnego startu Bun wynika
z krótszego czasu inicjalizacji silnika JavaScriptCore w trybie AOT
(Ahead-of-Time baseline JIT).
\centering figures/exp1_energy_boxplot.pdf{ \includegraphics[width=\linewidth]{figures/exp1_energy_boxplot}}{ \fbox{0.95\linewidth{\centering \textit{[Rysunek: boxploty energii per (runtime workload) — zostanie dodany po generacji wykresów]} }}} \caption{Rozkłady energii pakietu CPU~[J] per (runtime workload), powtórzeń. Dolne/górne krawędzie pudełka: Q1/Q3; wąsy: ; krzyżyki: wartości odstające. Wykresy na osi Y są niezależnie skalowane per workload.}
Rysunek~[→] prezentuje rozkłady energii. Niskie IQR (~J) i brak nakładania się rozkładów między runtimeami potwierdzają wysoką powtarzalność pomiarów i istotność różnic.
Odpowiedź na RQ2: Bun jest środowiskiem uruchomieniowym o najniższym zużyciu energii dla workloadów CPU-bound ( vs Node.js), I/O-bound (), Mixed REST () i cold start (). Deno przewyższa energetycznie Bun wyłącznie przy workloadach memory-bound ( vs Node.js).
Odpowiedź na RQ3: Typ workloadu determinuje wybór środowiska uruchomieniowego. Nie istnieje
środowisko dominujące we wszystkich kategoriach: Bun wygrywa w 4z6kategorii,
Node.js w1~(SSR), Deno w1(memory).
RQ4: Amortyzacja JIT — Energia w Funkcji Liczby Iteracji
Eksperyment JE-EXP-4 zbadał energię per iterację w~funkcji rozmiaru zadania (liczby iteracji ) dla workloadów CPU-bound i Mixed REST, per konfiguracja.
\centering \small \caption{Energia per iterację~[mJ/iter] dla workloadu CPU-bound w funkcji ~iteracji (#JE-EXP-4, ). Pogrubiono wartości dla , po stabilizacji JIT.}
| iteracji | Node.js~[mJ/iter] | Deno~[mJ/iter] | Bun~[mJ/iter] |
| 1 | 1017{,}9 | 1128{,}0 | 692{,}0 | | 5 | 211{,}5 | 231{,}9 | 140{,}8 | | 10 | 109{,}4 | 118{,}9 | 73{,}3 | | 50 | 63{,}1 | 67{,}3 | 37{,}7 | | 100 | 55{,}1 | 57{,}0 | 34{,}1 | | 500 | **45{,**1} | **45{,**8} | **30{,**4} | | 1000 | **43{,**7} | **43{,**6} | **30{,**0} | | 5000 | **42{,**0} | **41{,**7} | **29{,**4} |
Tabela~[→] oraz Rysunek~[→] ujawniają wyraźny
efekt amortyzacji JIT dla V8~(Node.js, Deno): energia per iterację spada zok.
–zakresie –
(zmiana między a wynosi ), co wyznacza \textbf{próg
amortyzacji JIT} na poziomie ok.~~wywołań.mJ przy do ok.mJ przy — redukcja o.
Plateau efektywności energetycznej osiągane jest w
\centering figures/exp4_jit_amortisation.pdf{ \includegraphics[width=\linewidth]{figures/exp4_jit_amortisation}}{ \fbox{0.95\linewidth{\centering \textit{[Rysunek: krzywe amortyzacji JIT energia/iter vs N — zostanie dodany po generacji wykresów]} }}} \caption{Energia per iterację~[mJ/iter] w funkcji liczby iteracji~ (skala log) dla workloadów CPU-bound i Mixed REST. Linie pionowe oznaczają próg amortyzacji JIT ( dla V8).}
Bun osiąga plateau energetyczne szybciej — już przy (zmiana z~
do wynosi ), co wynika z braku wielopoziomowego kompilatora JIT
w JavaScriptCore (brak odpowiednika Turbofan). Przy Bun jest o~
i~ efektywniejszy niż odpowiednio Node.js iDeno, natomiast przy
różnica stabilizuje się na– — zbieżna z wynikami workloadu
CPU-bound z~#JE-EXP-1. Wynik ma bezpośrednie implikacje dla środowisk FaaS:
funkcje serverless wywoływane rzadziej niż ok.~500 razy per instancja
(typowe dla niskiej intensywności ruchu) są energetycznie znacznie droższe
dla V8 niż wynikałoby z pomiarów steady-state.
Odpowiedź na RQ4: Próg amortyzacji JIT dla V8 (Node.js, Deno) wynosi
wywołań, po którym energia per iterację stabilizuje się wodległości
od asymptoty. Bun (JavaScriptCore bez Turbofan) osiąga plateau przy ,
ale zachowuje stałą przewagę energetyczną (–) nad V8 niezależnie od.
RQ4 (cd.): Idle Power i Parametry Keep-alive (#JE-EXP-5)
Eksperyment JE-EXP-5 wyznaczył parametry modelu energetycznego keep-alive dla środowisk FaaS: moc w stanie spoczynku i~energię inicjalizacji instancji , per konfiguracja.
Uwaga terminologiczna: w tym eksperymencie oznacza
całkowity koszt energetyczny uruchomienia ciepłej instancji — obejmuje spawn
procesu, załadowanie modułów i~wykonanie wywołań
rozgrzewkowych do ustabilizowania JIT. Wartość ta (J) jest
ok.[→]
(–~J), ponieważ JE-EXP-1 mierzył wyłącznie energię spawnu procesu
do pierwszej odpowiedzi HTTP, natomiast w modelu LACE-RL obejmuje
pełen koszt doprowadzenia instancji do stanu steady-state JIT.10-krotnie wyższa niż energia pierwszego zimnego żądania HTTP zTab.
\centering \small *Parametry energetyczne keep-alive (#JE-EXP-5, ). P_{\text{idle* mocy przy braku obciążenia~[W]; E_{cold}\lambda_{idle} = P_{idle} / P_{active}P_{sys} = 3{,}10$~W (baseline systemowy).}
| Runtime | [J] | [W] | ~[W] | |
| Node.js v24.15.0 | 3{,}49 | 3{,}05 | 14{,}90 | 0{,}205 | | Deno 2.8.1 | 3{,}58 | 3{,}01 | 14{,}92 | 0{,}202 | | Bun 1.3.14 | 3{,}49 | 3{,}15 | 15{,}31 | 0{,}206 |
| System (brak rt) | — | 3{,}10 | — | — |
Wyniki (Tabela~[→]) ujawniają zaskakującą jednorodność:
dla wszystkich trzech runtimeów mieści się w przedziale
–W ijest niemal identyczna z poziomem systemowym (~W).
Oznacza to, że uruchomiony, ale nieaktywny proces runtimes nie generuje mierzalnego
narzutu energetycznego ponad baseline systemu.
Współczynnik jest zbieżny z domyślną wartością
założoną w modelu LACE-RL (, Sun et al.~2026), co empirycznie
waliduje założenia modelu dla wszystkich trzech badanych runtimeów.
Energia zimnego startu J jest porównywalna dla
Node.js iBun, nieco wyższa dla Deno (~J). Przy mocy aktywnej
~W i ~W, próg
amortyzacji zimnego startu (liczba żądań obsługiwana przez ciepłą instancję
zamiast zimnego startu, przy założeniu czasu obsługi żądania ~s)
wynosi ~żądania,
co praktycznie oznacza, że utrzymywanie ciepłej instancji (keep-alive) jest
energetycznie korzystne już od pierwszego żądania.
RQ5: Model Decyzyjny TOPSIS — Energia vs Latencja
Eksperyment JE-EXP-3 zastosował model TOPSIS do porównania rekomendacji runtimeów przy optymalizacji energetycznej~(, , ) z~podejściem latency-only.
\centering \small \caption{Rekomendacje TOPSIS vs latency-only per workload (#JE-EXP-3). Pogrubiono przypadki rozbieżności.}
| Workload | TOPSIS (energia latencja) | Latency-only |
| CPU-bound | Bun | Bun | | I/O-bound | Bun | Bun | | Mixed REST | Bun | Deno | | Memory | Deno | Deno | | SSR | Node.js | Node.js | | Cold start | Bun | Bun |
Model TOPSIS (Tabela~[→]) daje rekomendację odmienną od latency-only
w~z kategorii workloadów (): dla workloadu Mixed REST TOPSIS
wskazuje Bun (energetycznie tańszy o~), podczas gdy latency-only preferuje
Deno (szybszy o~~ms — remis w medianach). Analiza wrażliwości wykazała, że
ta rozbieżność jest stabilna: dla każdej badanej kombinacji wag
odsetek odmiennych rekomendacji wynosi niezmiennie
, co wskazuje, że rozbieżność wynika ze struktury danych (bardzo zbliżone
mediany latencji Bun i Deno przy Mixed REST), a nie z przyjętych wag.
Wynik nie osiągnął zakładanego progu różnych rekomendacji sformułowanego
whipotezie EXP-3. Świadczy to, że dla badanego zestawu workloadów serverless
i dwóch kryteriów (energia, latencja) obydwa podejścia prowadzą do zbieżnych
rekomendacji wz przypadkach. Jest to wynik istotny: optymalizacja wyłącznie
latencji prowadzi do energetycznie optymalnego wyboru w~ kategorii
— co ogranicza uzasadnienie dla złożonego modelu MCDM w prostych scenariuszach
wdrożeniowych, choć nie eliminuje go dla środowisk wielokryterialnych.
Odpowiedź na RQ5: Model TOPSIS z wagami energetycznymi różni się od
latency-only w~ kategorii workloadów ( z~). Ranking TOPSIS jest
stabilny na zmiany wag, adominującym środowiskiem w rankingu wielokryterialnym
pozostaje Bun (4z6 workloadów) — identycznie jak woptimizacji latencji.
RQ6: Walidacja Cross-Platform — Stabilność Rankingów
Eksperyment JE-EXP-1 powtórzono wcałości na platformie P2 (Intel Xeon E-2176G,
Coffee Lake, 6C/12T, TDP80W). Cel: zweryfikować, czy rankingi energetyczne uzyskane
naP1 (Skylake, 4C/8T, TDP65W) są specyficzne dla mikroarchitektury,
czy~też odzwierciedlają właściwości silników JS niezależne od sprzętu.
\centering\small
\caption{Stabilność rankingów energetycznych między platformami.
N~=Node.js, D=Deno, B=~Bun (posortowane rosnąco).
= zmiana mediany lidera: P2 vs P1.}
| Workload | Ranking P1 | Ranking P2 | Zgodny | ~[%] |
| CPU-bound | B D N | B D N | \checkmark | | | I/O-bound | B D N | B D N | \checkmark | | | Memory-bound | D B N | D B N | \checkmark | | | SSR | N D B | N D B | \checkmark | | | Mixed REST | B D N | B D N | \checkmark | | | Cold Start | B N D | B N D | \checkmark | |
| 3{l}{Ranking zgodny w 6/6 workloadów} | | |
Tabela~[→] pokazuje, że wszystkie sześć rankingów jest
identycznych na obu platformach ( stabilność). Wartości bezwzględne
energii są wyższe na P2 (–), co wynika
zwyższego TDP procesora (80W vs 65W) iwiększej liczby rdzeni (6C vs 4C).
Proporcje między runtimeami zachowują się jednak spójnie: Bun pozostaje liderem
energetycznym przy I/O-bound ( vs Node.js na P2, na P1),
a~Node.js przewodzi przy SSR na obu platformach ( vs Bun na P2).
\centering figures/cross_platform_bars.pdf{ \includegraphics[width=\linewidth]{figures/cross_platform_bars}}{ \fbox{0.95\linewidth{\centering \textit{[Rysunek: wykres słupkowy porównania P1 vs P2 — zostanie dodany po generacji wykresów]} }}} \caption{Porównanie median energii pakietu CPU [J] na platformach P1 (i7-6700) i~P2 (E-2176G). Rankingi wewnętrzne (kolejność słupków) identyczne na obu platformach.}
Platforma P2 udostępnia domenę RAPL DRAM (intel-rapl:0:2), niedostępną
naP1. Analiza wykazała, że energia DRAM stanowi – energii pakietu CPU
wzależności od workloadu, z~najwyższym udziałem przy operacjach memory-bound ().
Potwierdza to, że brak domeny DRAM na P1 mógł prowadzić do niedoszacowania całkowitego
kosztu energetycznego workloadów pamięciocentrycznych.
Odpowiedź na RQ6: Rankingi energetyczne Node.js/Deno/Bun są \textbf{w100%
stabilne} między mikroarchitekturami Skylake (2015) i Coffee Lake (2018). Wartości
bezwzględne skalują się zTDP platformy, lecz proporcje między runtimeami różnią się
o~mniej niż punkty procentowe między platformami, co potwierdza generalizowalność
wyników P1 na klasy platformy x86-64.
Podsumowanie Wyników
\centering \small Zbiorcze odpowiedzi na pytania badawcze.
| Pytanie badawcze | Odpowiedź |
RQ1 Metodologia pomiaru & dla V8 i JavaScriptCore; wpływ GC na medianę . \ \addlinespace RQ2 Który runtime jest energetycznie najlepszy? & Bun (4 z 6 workloadów); Node.js najlepszy przy SSR; Deno przy memory-bound. \ \addlinespace RQ3 Zależność od typu workloadu? & Silna: Bun vs Node.js przy I/O-bound, ale przy SSR. Żaden runtime nie dominuje we wszystkich kategoriach. \ \addlinespace RQ4 Amortyzacja JIT & Próg amortyzacji V8: wywołań. Bun plateau przy . Przy różnice między runtimeami odwracają się względem steady-state. \ \addlinespace RQ5 Model decyzyjny & — identyczne dla wszystkich 3 runtimeów. TOPSIS różni się od latency-only w przypadków (workload Mixed REST). \ \addlinespace RQ6 Walidacja cross-platform & Rankingi 100% stabilne (6/6 workloadów) między Skylake (P1) a Coffee Lake (P2). Proporcje między runtimeami różnią się p.p. między platformami. \
Bibliografia
Footnotes
-
Pereira et al. (2017). Energy Efficiency Across Programming Languages: How Do Energy, Time, and Memory Relate?. Proceedings of the 10th ACM SIGPLAN International Conference on Software Language Engineering (SLE 2017). ↩
-
Laakso (2025). The Next Generation of Server-Side JavaScript Runtimes: Node.js, Deno and Bun. Turku University of Applied Sciences. ↩