Retour au blog
Performances & Benchmarks · Synthèse de bancs tiers · 12 min de lecture

Rust vs Node.js : benchmark backend et latence réelle

Affane Daylami · Fondateur· 24 août 2026

Sur un banc communautaire indépendant mis à jour en août 2025, les frameworks Rust tournent tous entre 18 000 et 22 000 requêtes par seconde avec 1,4 à 1,7 ms de latence. Les frameworks Node.js équivalents plafonnent entre 5 766 et 9 340 req/s, à 3,4-5,5 ms, sur le même matériel (Sharkbench, 24 août 2025).

Nous n'avons pas fait tourner ce banc nous-mêmes : ce sont des chiffres tiers, publics, sourcés et datés. Cet article détaille ce qu'ils disent, la méthodologie derrière, et ce que ça change réellement pour un choix de backend — pas une comparaison Aurabase contre un concurrent.

Le cœur d'Aurabase tourne en Rust, sur axum et tokio — vérifié dans le Cargo.toml du monorepo, dix services partageant la même dépendance. Mais nous n'avons publié aucun chiffre de performance qui nous soit propre à ce jour. Si vous cherchez une latence Aurabase précise, elle n'existe pas encore : la méthodologie viendra avant le chiffre, pas l'inverse.

L'essentiel
  • Sur Sharkbench (banc communautaire, Ryzen 7 7800X3D, Docker/Linux, 24/08/2025) : Actix, Hyper, Axum et Rocket tournent tous entre 18 047 et 21 965 req/s à 1,4-1,7 ms. Fastify, Koa et Express plafonnent entre 5 766 et 9 340 req/s côté Node.js, à 3,4-5,5 ms.
  • Le runtime pèse autant que le langage : le même code Express passe de 5 766 req/s sur Node.js à 18 917 req/s sur Bun — un facteur ×3,3 sans changer une ligne.
  • L'écart de mémoire est le plus net : 8,5 Mo pour Axum contre 82,5 Mo pour Express/Node.js — cohérent avec l'absence de garbage collector de Rust.
  • Aurabase n'a publié aucun benchmark qui lui soit propre à ce jour. Le cœur Rust/axum/tokio est vérifié dans le code — pas la performance.
  • Un chiffre isolé ne prouve rien : matériel, version de framework, taille de payload et niveau de concurrence font varier le classement plus que le langage seul.
#
Le banc

Ce que montre un banc tiers récent

Sharkbench est un projet communautaire indépendant qui mesure trois choses : la capacité d'un framework à traiter des requêtes HTTP concurrentes, des opérations I/O et de la sérialisation JSON. Le test tourne sous Docker/Linux sur un Ryzen 7 7800X3D, avec une dernière mise à jour publique le 24 août 2025 (sharkbench.dev/web, consulté le 24 août 2026).

Débit en requêtes par seconde, Rust vs Node.jsActix (Rust) 21 965 req/s, Hyper (Rust) 21 781 req/s, Axum (Rust) 21 030 req/s, Rocket (Rust) 18 047 req/s, Fastify (Node.js) 9 340 req/s, Koa (Node.js) 8 828 req/s, Express (Node.js) 5 766 req/s. Source : Sharkbench, 24 août 2025.05k10k15k20kActix (Rust)21 965Hyper (Rust)21 781Axum (Rust)21 030Rocket (Rust)18 047Fastify (Node.js)9 340Koa (Node.js)8 828Express (Node.js)5 766

Source : Sharkbench, 24 août 2025 — Docker/Linux, Ryzen 7 7800X3D.

Axum — le framework qu'utilise Aurabase pour son cœur Rust, vérifié dans Cargo.toml — traite 21 030 requêtes par seconde sur ce banc. Express, le framework Node.js le plus utilisé en production, en traite 5 766 sur le même matériel : un facteur 3,6. Ce n'est pas un cas isolé. Les quatre frameworks Rust testés se tiennent tous dans une fourchette étroite de 18 000 à 22 000 req/s, alors que les trois frameworks Node.js testés plafonnent entre 5 766 et 9 340.

En pratique, « req/s » mesure le débit sous charge concurrente soutenue — pas la vitesse d'une requête isolée sur un site à faible trafic. Pour un endpoint appelé une fois toutes les quelques secondes, la différence ne se voit jamais. Elle devient déterminante sur un endpoint chaud — un flux temps réel, une API publique à fort trafic, un job qui enchaîne des milliers d'appels — là où le nombre de requêtes traitées par cœur CPU, à matériel égal, fixe directement la facture d'infrastructure.

#
Latence

La latence suit le même schéma

La latence moyenne suit la même hiérarchie sur ce banc : 1,4 à 1,7 ms pour les frameworks Rust testés, contre 3,4 à 5,5 ms pour les frameworks Node.js testés.

Latence moyenne en millisecondes, Rust vs Node.jsActix (Rust) 1,4 ms, Hyper (Rust) 1,5 ms, Axum (Rust) 1,6 ms, Rocket (Rust) 1,7 ms, Fastify (Node.js) 3,4 ms, Koa (Node.js) 3,6 ms, Express (Node.js) 5,5 ms. Source : Sharkbench, 24 août 2025.0 ms1 ms2 ms3 ms4 ms5 msActix (Rust)1,4 msHyper (Rust)1,5 msAxum (Rust)1,6 msRocket (Rust)1,7 msFastify (Node.js)3,4 msKoa (Node.js)3,6 msExpress (Node.js)5,5 ms

Source : Sharkbench, 24 août 2025 — latence moyenne, pas p99.

Ce chiffre est une moyenne, pas un p99. Les pauses de garbage collector d'un runtime managé affectent surtout la queue de distribution — les requêtes les plus lentes, pas la médiane. C'est le sujet d'un article dédié de cette série : pourquoi l'absence de garbage collector change la latence p99.

#
Pourquoi

Pourquoi Rust n'a pas de pause GC à payer

Rust gère la mémoire par ownership, vérifié à la compilation — pas de garbage collector qui tourne en tâche de fond et interrompt l'exécution. Le Rust Book officiel le résume ainsi : « None of the features of ownership will slow down your program while it's running » (The Rust Programming Language, doc.rust-lang.org, consulté le 24 août 2026). La mémoire est libérée dès que la variable qui la possède sort de portée — un instant connu à la compilation, pas une pause imprévisible à l'exécution.

ownership.rs
RUST
fn main() {
let data = String::from("réponse API"); // `data` possède la chaîne
process(data); // la possession part ici
// `data` n’est plus valide ici — pas de pointeur pendant, pas de double free
} // `data` est libéré ici, de façon déterministe
fn process(s: String) {
println!("{s}");
} // `s` sort de portée ici : libération immédiate, sans passe de ramasse-miettes

Node.js, à l'inverse, s'exécute sur un seul thread JavaScript et délègue les opérations I/O au noyau via une boucle d'événements à plusieurs phases (timers, callbacks différés, poll, check...) — mais tout calcul synchrone sur ce thread, y compris une passe de garbage collection du moteur V8, bloque l'exécution pendant qu'il tourne (documentation officielle Node.js, nodejs.org, consultée le 24 août 2026). C'est une différence de modèle mémoire, pas un détail d'implémentation.

#
La nuance

La vraie surprise : le runtime pèse autant que le langage

Le résultat le plus contre-intuitif du même banc ne concerne pas Rust : il concerne Node.js lui-même. Express — un seul et même code, une seule et même API — passe de 5 766 req/s sur Node.js à 18 917 req/s sur Bun, soit un facteur ×3,3, sans changer une ligne de code applicatif (Sharkbench, 24 août 2025).

Débit d'Express selon le runtime JavaScript, comparé à AxumAxum sur Rust : 21 030 req/s. Express sur Bun : 18 917 req/s. Express sur Deno : 6 088 req/s. Express sur Node.js : 5 766 req/s. Même code Express dans les trois cas. Source : Sharkbench, 24 août 2025.05k10k15k20kAxum (Rust, référence)21 030Express sur Bun18 917Express sur Deno6 088Express sur Node.js5 766

Source : Sharkbench, 24 août 2025 — même code Express, trois runtimes JavaScript.

Sur Deno, ce même code Express plafonne à 6 088 req/s — proche de Node.js, loin de Bun. Le langage JavaScript est identique dans les trois cas ; c'est le runtime — son moteur JS, son implémentation d'event loop, son ramasse-miettes — qui change la donne. Comparer « Rust » à « Node.js » sans préciser le runtime, la version et le framework revient à comparer des configurations, pas des langages.

Et Go dans tout ça ?
Sur ce même banc, le framework Go Gin plafonne à 3 546 req/s quand FastHTTP — toujours en Go — grimpe à 5 567 req/s avec une latence de seulement 0,7 ms (Sharkbench, 24 août 2025). Deux résultats très différents pour un seul langage : un chiffre isolé ne résume jamais un écosystème entier.
#
Méthodologie

Pourquoi un seul chiffre de benchmark ne suffit jamais

TechEmpower Framework Benchmarks illustre la même idée à plus grande échelle. Son dépôt open source a été mis à jour le 24 mars 2026, et son round le plus récent (round 23) a fait l'objet d'un billet daté du 16 mars 2026 (TechEmpower, consulté le 24 août 2026). Ce projet fait tourner de nombreux types de tests sur des centaines d'implémentations, précisément parce qu'un seul test ne représente jamais un framework, encore moins un langage.

Convex, un acteur du marché des bases de données, a formulé la position la plus nette sur le sujet : refuser de participer à la « guerre des bar charts » marketing entre bases de données concurrentes, jugée trompeuse. « It's scaling theater, not scaling », écrit l'équipe (Convex, consulté le 24 août 2026). Nous partageons cette lecture : un chiffre nu, sans méthodologie publiée, ne prouve rien — ni pour un concurrent, ni pour nous.

Ce que ça change concrètement : matériel (CPU, RAM), version exacte du framework et du runtime, taille du payload JSON, niveau de concurrence et durée du test font tous varier le classement — parfois plus que le choix du langage lui-même. Un banc qui ne publie pas ces paramètres ne se reproduit pas, donc ne se vérifie pas — voir notre méthodologie complète et reproductible pour benchmarquer un backend.

#
Aurabase

Et Aurabase dans tout ça ?

Le cœur backend d'Aurabase est écrit en Rust, sur axum et tokio — vérifié dans le Cargo.toml du monorepo : dix services (aura-gateway, aura-auth, aura-db…) partagent la même dépendance workspace axum (0.8) et le même runtime tokio, en édition 2021. Le gateway qui route le trafic data plane et management plane s'appuie sur hyper en plus d'axum — le détail complet est dans notre article sur l'architecture data plane / management plane du gateway. La structure du workspace Cargo qui porte ces dix services est documentée dans notre article sur le workspace Cargo.

Ce que nous n'avons pas encore, c'est un chiffre de débit ou de latence Aurabase publié avec méthodologie et matériel documentés. C'est délibéré : nous préférons publier la méthodologie avant le chiffre plutôt que l'inverse — c'est le sujet d'un prochain article de cette série.

Pour la comparaison d'architecture complète — cœur Rust unifié chez Aurabase contre stack hétérogène Elixir/Go/TypeScript/Node documenté chez un concurrent direct — voir notre comparatif détaillé Aurabase vs Supabase. Si vous migrez déjà un projet, le guide de migration Supabase vers Aurabase couvre le schéma, les policies RLS et le SDK.

#
Données

Annexe : tableau de données complet

L'ensemble des lignes citées dans cet article, telles que publiées par Sharkbench le 24 août 2025 (Docker/Linux, Ryzen 7 7800X3D).

FrameworkRuntimeReq/sLatenceMémoire
ActixRust21 9651,4 ms16,6 Mo
HyperRust21 7811,5 ms8,6 Mo
AxumRust21 0301,6 ms8,5 Mo
RocketRust18 0471,7 ms6,4 Mo
FastifyNode.js9 3403,4 ms57,0 Mo
KoaNode.js8 8283,6 ms53,3 Mo
ExpressNode.js5 7665,5 ms82,5 Mo
ExpressBun18 9171,3 ms53,3 Mo
ExpressDeno6 0885,0 ms130,7 Mo
GinGo3 5461,0 ms16,7 Mo
FastHTTPGo5 5670,7 ms13,4 Mo

Citer ces données : Sharkbench, « Web Framework Benchmarks », sharkbench.dev/web, dernière mise à jour le 24 août 2025.

#
FAQ

Questions fréquentes

Est-ce que ça veut dire que Node.js est un mauvais choix ?+
Non. Node.js reste un choix solide pour beaucoup de backends, surtout quand l'équipe maîtrise déjà TypeScript et que la charge n'est pas dominée par du calcul CPU. L'écart mesuré ici porte sur le débit brut et la latence sous forte concurrence — pas sur la productivité de développement ni l'écosystème de packages. Sur Bun, l'écart avec Rust se réduit fortement (18 917 req/s pour Express contre 21 030 pour Axum) : le choix du runtime compte autant que le choix du langage.
Pourquoi Express est-il si lent comparé aux autres frameworks Node.js ?+
Sur ce banc, Express (5 766 req/s sur Node.js) est le plus lent des frameworks Node.js testés, derrière Koa (8 828) et Fastify (9 340). Express date de 2010 et son design privilégie la simplicité du middleware plutôt que le débit brut. À runtime égal, le choix du framework fait déjà un écart de ×1,6 entre Express et Fastify (Sharkbench, 24 août 2025).
Comment ce benchmark a-t-il été réalisé, et peut-on le reproduire ?+
Le banc cité dans cet article vient de Sharkbench, un projet communautaire indépendant qui teste les requêtes HTTP concurrentes, les I/O et la sérialisation JSON sous Docker/Linux, sur un Ryzen 7 7800X3D, avec une dernière mise à jour publique le 24 août 2025 (sharkbench.dev/web). Ce n'est pas un banc Aurabase — nous ne l'avons ni exécuté ni validé nous-mêmes ; nous le citons parce que sa méthodologie et son matériel sont publiés, contrairement à beaucoup de chiffres marketing.
Est-ce qu’Aurabase a publié ses propres benchmarks ?+
Non, pas à ce jour. Le cœur Rust/axum/tokio d'Aurabase est vérifié dans le code source du monorepo, mais aucun chiffre de débit ou de latence propre à Aurabase n'a été mesuré et publié. Cet article compare Rust et Node.js en général, à partir de bancs tiers sourcés — ce n'est pas une comparaison Aurabase contre un concurrent.
Un écart de débit et de mémoire, ça change quoi sur la facture d’infrastructure ?+
Sur le banc cité, Axum consomme 8,5 Mo de mémoire contre 82,5 Mo pour Express sur Node.js — un facteur proche de ×10 (Sharkbench, 24 août 2025). Moins de mémoire par instance et plus de requêtes traitées par cœur CPU permettent, à trafic égal, de tenir la même charge avec moins d'instances ou des instances plus petites. L'impact réel dépend toutefois de votre profil de charge (I/O-bound ou CPU-bound) et de votre fournisseur cloud — ce chiffre n'est pas une promesse d'économie automatique.
#
Conclusion

Ce qu'il faut retenir

Sur le banc cité ici, les frameworks Rust tournent tous dans une fourchette étroite — 18 000 à 22 000 req/s, 1,4-1,7 ms — loin devant les frameworks Node.js sur Node.js lui-même (5 766-9 340 req/s, 3,4-5,5 ms). Mais le runtime change la donne autant que le langage : Express sur Bun rattrape presque Axum sur Rust.

Si vous évaluez un backend sur la seule performance brute, exigez la méthodologie avant le chiffre : matériel, version, taille de payload, niveau de concurrence. Aurabase n'a pas encore publié ses propres chiffres ; quand ce sera le cas, la méthodologie viendra en premier.

ARCHITECTURE RUST VÉRIFIABLE

Le code compte plus qu'un chiffre marketing.

Le cœur Aurabase est en Rust sur axum — ouvert dans le dépôt, pas dans une slide. Créez un projet et vérifiez par vous-même.

Créer un projet Lire la documentation d'architecture
Aucune carte bancaire requise · 500 MB gratuits · 50 000 MAU