PRODSuwerenna europejska platforma BaaSOtwórz Panel →

Wydajność · 12 min odczytu

Rust vs Node.js: test porównawczy backendu i opóźnienia

Affane Daylami · Fondateur · 5 lipca 2026

Powrót do bloga

Na niezależnym stanowisku społeczności zaktualizowanym w sierpniu 2025 r. wszystkie frameworki Rust obsługują od 18 000 do 22 000 żądań na sekundę z opóźnieniem od 1,4 do 1,7 ms. Odpowiednik frameworków Node.js ogranicza prędkość od 5766 do 9340 wymagań/s przy 3,4–5,5 ms na tym samym sprzęcie (Sharkbench, 24 sierpnia 2025 r.).

Ten tekst w języku angielskim został wygenerowany automatycznie na podstawie francuskiego oryginału i nie był jeszcze recenzowany.
Ta strona została przetłumaczona automatycznie. Wersja angielska jest miarodajna.

Nie sami prowadziliśmy tę analizę: są to dane osób trzecich, publiczne, pochodzące i datowane. W tym artykule szczegółowo opisano, co mówią, stojącą za tym metodologię i co faktycznie zmienia w przypadku wyboru backendu — a nie porównanie Aurabase z konkurencją.

Rdzeń Aurabase działa w Rust, na axum i tokio — zweryfikowany w Cargo.toml monorepo, dziesięć usług współdzielących tę samą zależność. Jednak do tej pory nie opublikowaliśmy żadnych własnych danych dotyczących wydajności. Jeśli szukasz precyzyjnego opóźnienia Aurabase, ono jeszcze nie istnieje: metodologia będzie przed liczbą, a nie odwrotnie.

Najważniejsze

  • W Sharkbench (na ławce społeczności, Ryzen 7 7800X3D, Docker/Linux, 24.08.2025): Actix, Hyper, Axum i Rocket pracują z szybkością od 18 047 do 21 965 wymagań/s przy 1,4–1,7 ms. Fastify, Koa i Express ograniczają od 5766 do 9340 wymagań/s po stronie Node.js, przy 3,4–5,5 ms.
  • Środowisko wykonawcze waży tyle samo, co język: ten sam kod Express wzrasta z 5766 żądań/s w Node.js do 18 917 żądań/s w Bun — współczynnik × 3,3 bez zmiany wiersza.
  • Luka w pamięci jest najbardziej wyraźna: 8,5 MB dla Axum w porównaniu z 82,5 MB dla Express/Node.js – co jest zgodne z brakiem modułu zbierającego elementy bezużyteczne w Rust.
  • Aurabase nie opublikował dotychczas żadnych własnych testów porównawczych. Rdzeń Rust/axum/tokio jest sprawdzany w kodzie — a nie wydajność.
  • Pojedyncza liczba niczego nie dowodzi: sprzęt, wersja frameworka, rozmiar ładunku i poziom konkurencji różnią się w rankingu bardziej niż sam język.
#
Ławka

Co pokazuje niedawna analiza zewnętrzna strony trzeciej

Sharkbench to niezależny projekt społecznościowy, który mierzy trzy rzeczy: zdolność frameworka do obsługi współbieżnych żądań HTTP, operacje we/wy i serializację JSON. Test odbywa się w systemie Docker/Linux na procesorze Ryzen 7 7800X3D, a ostatnia publiczna aktualizacja miała miejsce 24 sierpnia 2025 r. (sharkbench.dev/web, dostęp: 24 sierpnia 2026 r.).

Przepustowość w żądaniach na sekundę, Rust vs Node.jsActix (Rust) 21 965 zapotrzebowań/s, Hyper (Rust) 21 781 zapotrzebowań/s, Axum (Rust) 21 030 zapotrzebowań/s, Rocket (Rust) 18 047 zapotrzebowań/s, Fastify (Node.js) 9 340 zapotrzebowań/s, Koa (Node.js) 8828 zapotrzebowań/s, Express (Node.js) 5766 żądań/s. Źródło: Sharkbench, 24 sierpnia 2025 r.05k10k15k20kActix (rdza)21 965Hyper (Rdza)21 781Aksum (Rdza)21 030Rakieta (rdza)18 047Fastify (Node.js)9 340Koa (Node.js)8 828Ekspresowe (Node.js)5 766

Źródło: Sharkbench, 24 sierpnia 2025 — Docker/Linux, Ryzen 7 7800X3D.

Axum — framework, którego używa Aurabase w swoim rdzeniu Rust, zweryfikowany w Cargo.toml — przetwarza na tym stanowisku 21 030 żądań na sekundę. Express, framework Node.js najczęściej używany w środowisku produkcyjnym, przetwarza 5766 na tym samym sprzęcie: współczynnik 3,6. To nie jest odosobniony przypadek. Wszystkie cztery przetestowane frameworki Rust mieszczą się w wąskim zakresie od 18 000 do 22 000 wymagań/s, podczas gdy trzy testowane frameworki Node.js osiągają limit od 5766 do 9340.

W praktyce „req/s” mierzy przepustowość przy ciągłym, współbieżnym obciążeniu, a nie prędkość izolowanego żądania w witrynie o małym natężeniu ruchu. W przypadku punktu końcowego wywoływanego raz na kilka sekund różnica nigdy nie jest widoczna. Ma to decydujące znaczenie w przypadku gorącego punktu końcowego — przepływu w czasie rzeczywistym, publicznego interfejsu API o dużym natężeniu ruchu, zadania obejmującego tysiące wywołań — gdzie liczba żądań przetworzonych na rdzeń procesora przy jednakowym sprzęcie bezpośrednio określa rachunek za infrastrukturę.

#
Utajenie

Opóźnienie ma ten sam wzór

Średnie opóźnienie ma tę samą hierarchię na tym stanowisku: od 1,4 do 1,7 ms dla testowanych frameworków Rust w porównaniu do 3,4 do 5,5 ms dla testowanych frameworków Node.js.

Średnie opóźnienie w milisekundach, Rust vs Node.jsActix (rdza) 1,4 ms, Hyper (rdza) 1,5 ms, Axum (rdza) 1,6 ms, Rocket (rdza) 1,7 ms, Fastify (Node.js) 3,4 ms, Koa (Node.js) 3,6 ms, Express (Node.js) 5,5 ms. Źródło: Sharkbench, 24 sierpnia 2025 r.0 ms1 ms2 ms3 ms4 ms5 msActix (rdza)1,4 msHyper (Rdza)1,5 msAksum (Rdza)1,6 msRakieta (rdza)1,7 msFastify (Node.js)3,4 msKoa (Node.js)3,6 msEkspresowe (Node.js)5,5 ms

Źródło: Sharkbench, 24 sierpnia 2025 r. — średnie opóźnienie, a nie p99.

Liczba ta jest średnią, a nie p99. Wstrzymania związane ze śmieciami w zarządzanym środowisku wykonawczym wpływają głównie na kolejkę wysyłkową — na najwolniejsze żądania, a nie na medianę. Jest to temat dedykowanego artykułu z tej serii: dlaczego brak modułu zbierającego elementy bezużyteczne zmienia opóźnienie p99.

#
Dlaczego

Dlaczego Rust nie ma przerwy w GC do zapłaty

Rust zarządza pamięcią według własności, sprawdzaną w czasie kompilacji — żaden moduł zbierający elementy bezużyteczne nie działa w tle i nie zakłóca wykonywania. Oficjalna Księga Rust podsumowuje to w następujący sposób: „Żadna z cech własności nie spowolni twojego programu podczas jego działania” (The Rust Programming Language, doc.rust-lang.org, dostęp 24 sierpnia 2026). Pamięć jest zwalniana, gdy tylko zmienna będąca jej właścicielem wykracza poza zakres — jest to znany czas kompilacji, a nie nieprzewidywalna przerwa w czasie wykonywania.

ownership.rsrust
fn main() {
    let data = String::from("réponse API"); // `data` jest właścicielem ciągu
    process(data); // posiadanie opuszcza tutaj
    // „dane” nie są już tutaj ważne — żadnego wiszącego wskaźnika, żadnego podwójnego zwolnienia
} // „dane” są tutaj uwalniane w sposób deterministyczny

fn process(s: String) {
    println!("{s}");
} // `s` wykracza tutaj poza zakres: natychmiastowe wydanie, bez przepustki na śmieci

Z kolei Node.js działa na pojedynczym wątku JavaScript i deleguje operacje we/wy do jądra poprzez wielofazową pętlę zdarzeń (timery, odroczone wywołania zwrotne, odpytywanie, sprawdzanie...) — ale wszelkie synchroniczne obliczenia w tym wątku, w tym przepustka do zbierania elementów bezużytecznych z silnika V8, blokują wykonywanie podczas jego działania (oficjalna dokumentacja Node.js, nodejs.org, dostęp 24 sierpnia 2026). Jest to różnica w modelu pamięci, a nie szczegół implementacji.

#
Niuans

Prawdziwa niespodzianka: środowisko wykonawcze waży tyle samo, co język

Najbardziej sprzeczny z intuicją wynik z tej samej analizy nie dotyczy Rusta: dotyczy samego Node.js. Express — jeden i ten sam kod, jedno i to samo API — wzrasta z 5766 żądań/s w Node.js do 18 917 żądań/s w Bun, współczynnik ×3,3, bez zmiany wiersza kodu aplikacji (Sharkbench, 24 sierpnia 2025 r.).

Ekspresowa przepustowość zgodnie ze środowiskiem wykonawczym JavaScript w porównaniu do AxumAxum na rdzy: 21 030 wymagań/s. Ekspres w bułce: 18 917 zapotrzebowań/s. Express na Deno: 6088 zapotrzebowania/s. Express na Node.js: 5766 wymagań/s. Ten sam kod Express we wszystkich trzech przypadkach. Źródło: Sharkbench, 24 sierpnia 2025 r.05k10k15k20kAxum (Rdza, odniesienie)21 030Ekspres na bułce18 917Ekspres na Deno6 088Express w Node.js5 766

Źródło: Sharkbench, 24 sierpnia 2025 r. — ten sam kod Express, trzy środowiska wykonawcze JavaScript.

W Deno ten sam kod Express ogranicza się do 6088 żądań/s — blisko Node.js, daleko od Bun. Język JavaScript jest identyczny we wszystkich trzech przypadkach; To środowisko wykonawcze — silnik JS, implementacja pętli zdarzeń, zbieranie elementów bezużytecznych — zmienia grę. Porównywanie „Rust” do „Node.js” bez określenia środowiska wykonawczego, wersji i frameworku jest jak porównywanie konfiguracji, a nie języków.

I wejść w to wszystko?

Na tej samej próbie platforma Go Gin osiąga szczyt przy 3546 wymaganiach/s, gdy FastHTTP — wciąż w trybie Go — wzrasta do 5567 żądań/s przy opóźnieniu wynoszącym zaledwie 0,7 ms (Sharkbench, 24 sierpnia 2025 r.). Dwa bardzo różne wyniki dla jednego języka: izolowana liczba nigdy nie podsumowuje całego ekosystemu.

#
Metodologia

Dlaczego pojedynczy numer testu porównawczego nigdy nie wystarczy

Testy porównawcze TechEmpower Framework ilustrują ten sam pomysł na większą skalę. Repozytorium open source zostało zaktualizowane 24 marca 2026 r., a jego ostatnia runda (runda 23) była tematem postu z dnia 16 marca 2026 r. (TechEmpower, dostęp: 24 sierpnia 2026 r.). W tym projekcie przeprowadza się wiele rodzajów testów w setkach implementacji, właśnie dlatego, że pojedynczy test nigdy nie reprezentuje frameworka, nie mówiąc już o języku.

Convex, gracz na rynku baz danych, sformułował w tej sprawie najjaśniejsze stanowisko: odmawiając udziału w marketingowej „wojnie na wykresy słupkowe” pomiędzy konkurującymi bazami danych, uznanej za wprowadzającą w błąd. „To teatr skalowania, a nie skalowanie”, pisze zespół (Convex, dostęp 24 sierpnia 2026 r.). Podzielamy tę lekturę: gołe liczby, bez opublikowanej metodologii, niczego nie dowodzą – ani dla konkurencji, ani dla nas.

Konkretne zmiany: sprzęt (procesor, pamięć RAM), dokładna wersja frameworku i środowisko wykonawcze, rozmiar ładunku JSON, poziom konkurencji i czas trwania testu – wszystko to wpływa na ranking – czasem bardziej niż sam wybór języka. Ławka, która nie publikuje tych parametrów, nie reprodukuje się, dlatego nie weryfikuje się sama — zobacz naszą kompletną i powtarzalną metodologię benchmarkingu backendu.

#
Aurabaza

A Aurabase w tym wszystkim?

Podstawowy backend Aurabase jest napisany w języku Rust, na axum i tokio — sprawdzany w Cargo.toml monorepo: dziesięć usług (aura-gateway, aura-auth, aura-db…) ma tę samą zależność obszaru roboczego axum (0.8) i to samo środowisko wykonawcze tokiow 2021 r. wydanie. Brama, która kieruje ruchem płaszczyzny danych i płaszczyzny zarządzania, oprócz axum opiera się na hyper — szczegółowe informacje można znaleźć w naszym artykule na temat architektury płaszczyzny danych/płaszczyzny zarządzania bramy. Strukturę obszaru roboczego Cargo obsługującą te dziesięć usług opisano w naszym artykule na temat obszaru roboczego Cargo.

Nie mamy jeszcze opublikowanych danych dotyczących przepustowości i opóźnień Aurabase wraz z udokumentowaną metodologią i sprzętem. Jest to celowe: wolimy publikować metodologię przed wykresem, a nie odwrotnie – jest to temat przyszłego artykułu z tej serii.

Aby uzyskać pełne porównanie architektury — zunifikowany rdzeń Rust w Aurabase w porównaniu z heterogenicznym stosem Elixir/Go/TypeScript/Node udokumentowany u bezpośredniego konkurenta — zobacz nasze szczegółowe porównanie Aurabase vs Supabase. Jeśli już migrujesz projekt, przewodnik migracji Supabase do Aurabase omawia schemat, zasady RLS i SDK.

#
Dane

Dodatek: pełna tabela danych

Wszystkie wiersze cytowane w tym artykule, opublikowane przez Sharkbench 24 sierpnia 2025 r. (Docker/Linux, Ryzen 7 7800X3D).

StrukturaCzas wykonaniaUpraszanieUtajeniePamięć
ActixRdza21 9651,4 ms16,6 MB
HiperRdza21 7811,5 ms8,6 MB
AksumRdza21 0301,6 ms8,5MB
RakietaRdza18 0471,7 ms6,4 MB
UmocnijNode.js9 3403,4 ms57,0MB
KoaNode.js8 8283,6 ms53,3MB
WyrazićNode.js5 7665,5 ms82,5 MB
WyrazićKok18 9171,3 ms53,3 MB
WyrazićDeno6 0885,0 ms130,7 MB
GinIść3 5461,0 ms16,7 MB
Szybki HTTPIść5 5670,7 ms13,4 MB

Przytocz te dane: Sharkbench, „Web Framework Benchmarks”, sharkbench.dev/web, ostatnia aktualizacja 24 sierpnia 2025 r.

#
Często zadawane pytania

Często zadawane pytania

Czy to oznacza, że ​​Node.js to zły wybór?+
Nie. Node.js pozostaje dobrym wyborem dla wielu backendów, zwłaszcza gdy zespół jest już biegły w TypeScript, a obciążenie nie jest zdominowane przez obliczenia CPU. Zmierzona tutaj różnica dotyczy surowej przepustowości i opóźnień w warunkach dużej konkurencji, a nie produktywności programistycznej czy ekosystemu pakietów. Na Bun różnica w stosunku do Rusta jest znacznie zmniejszona (18 917 wymagań/s dla Express w porównaniu do 21 030 dla Axum): wybór środowiska wykonawczego jest tak samo ważny jak wybór języka.
Dlaczego Express jest tak wolny w porównaniu do innych frameworków Node.js?+
Na tym stanowisku Express (5766 wymagań/s w Node.js) jest najwolniejszym z testowanych frameworków Node.js, za Koa (8828) i Fastify (9340). Express pochodzi z 2010 roku, a jego konstrukcja faworyzuje prostotę oprogramowania pośredniczącego, a nie surową przepustowość. W tym samym czasie działania wybór frameworku już powoduje różnicę ×1,6 między Express i Fastify (Sharkbench, 24 sierpnia 2025 r.).
Jak osiągnięto ten poziom odniesienia i czy możemy go odtworzyć?+
Tabela cytowana w tym artykule pochodzi z Sharkbench, niezależnego projektu społecznościowego, który testuje współbieżne żądania HTTP, wejścia/wyjścia i serializację JSON w systemie Docker/Linux na procesorze Ryzen 7 7800X3D, a ostateczna publiczna aktualizacja została opublikowana 24 sierpnia 2025 r. (sharkbench.dev/web). To nie jest ławka Aurabase — sami jej nie testowaliśmy ani nie sprawdzaliśmy; cytujemy go, ponieważ w przeciwieństwie do wielu postaci marketingowych publikowane są jego metodologia i materiały.
Czy Aurabase opublikował własne testy porównawcze?+
Nie, nie do tej pory. Rdzeń Rust/axum/Tokio Aurabase został zweryfikowany w kodzie źródłowym monorepo, ale nie zmierzono i nie opublikowano żadnych danych dotyczących przepustowości ani opóźnień specyficznych dla Aurabase. W tym artykule ogólnie porównano Rusta i Node.js w oparciu o testy pochodzące z zewnętrznych źródeł — nie jest to porównanie Aurabase z konkurencją.
Różnica w przepustowości i pamięci. Jakie to ma znaczenie w rachunku za infrastrukturę?+
Na cytowanym stanowisku Axum zużywa 8,5 MB pamięci w porównaniu z 82,5 MB w przypadku Express w Node.js — współczynnik bliski × 10 (Sharkbench, 24 sierpnia 2025 r.). Mniej pamięci na instancję i więcej żądań przetworzonych na rdzeń procesora umożliwia, przy równym ruchu, utrzymanie tego samego obciążenia przy mniejszej liczbie lub mniejszych instancjach. Rzeczywisty wpływ zależy jednak od profilu obciążenia (związanego z we/wy lub procesora) i dostawcy usług w chmurze — liczba ta nie stanowi automatycznej obietnicy oszczędności.
#
Wniosek

O czym pamiętać

Na przytoczonym tutaj stanowisku wszystkie frameworki Rusta działają w wąskim zakresie — 18 000 do 22 000 req/s, 1,4–1,7 ms — znacznie wyprzedzając frameworki Node.js na samym Node.js (5766–9340 req/s, 3,4–5,5 ms). Ale środowisko wykonawcze zmienia sytuację w takim samym stopniu, jak język: Express na Bun prawie dogania Axum na Rust.

Jeśli oceniasz backend wyłącznie na podstawie surowej wydajności, przed podaniem liczby wymagaj metodologii: sprzętu, wersji, rozmiaru ładunku, poziomu konkurencji. Aurabase nie opublikował jeszcze własnych danych liczbowych; kiedy to nastąpi, na pierwszym miejscu będzie metodologia.

GOTOWY DO WDROŻENIA?

Twój backend w pięć minut.

Karta kredytowa nie jest wymagana · 500 MB za darmo · 50 000 MAU