Deux heures. 1 738 modifications. Ce qui a été testé.
Le détail du test d’endurance de PRNext : ce qui a été vérifié pendant deux heures, les résultats et leurs limites.
PRNext 0.1.18-alpha est disponible. Pour accompagner cette version, nous publions les mesures réalisées le 29 octobre sur son candidat de développement. Sur un petit VPS, le temps CPU et la mémoire comptent autant que la vitesse d’une requête. Nous avons comparé ce code à Next.js sur deux machines Linux, puis limité les ressources pour observer ce qui change réellement selon la charge.
Le candidat PRNext atteint 57 % de débit supplémentaire sur notre page SSR de 100 lignes avec un budget de 2 CPU. Sur le petit VPS, cette même page demande environ 37 % de CPU en moins par réponse, mais davantage de RAM. Ces deux résultats résument l’intérêt de cette comparaison : comprendre où PRNext apporte un gain, ce qu’il coûte et les cas où Next.js fait mieux.
Les mesures du 29 octobre 2026 portent sur le candidat de développement de la 0.1.18-alpha, au commit 2856155. Son manifeste conservait encore le numéro interne 0.1.17-alpha, mais son code et ses optimisations diffèrent du paquet npm 0.1.17-alpha. Le code source mesuré et ses empreintes sont liés en fin d’article.
La référence est Next.js 16.4.3, avec la même famille React 19.3.1 et la même application source. Le petit VPS utilise Node.js 22.23.4 ; le grand utilise Node.js 24.22.1. Sur chaque machine, tous les moteurs utilisent exactement le même exécutable Node. Comparer les deux machines entre elles ne permet pas d’isoler un effet matériel, puisque Node change aussi.
Le profil PRNext mesuré est Balanced, avec le moteur de rendu Web par défaut. Les empreintes complètes du binaire Linux et du paquet candidat, les valeurs avant correction et les plages de débit sont fournies dans les données associées. La version npm 0.1.18-alpha publiée le 30 octobre provient du commit 05a9ccd, avec des corrections supplémentaires de build et de développement. Cette campagne ne mesure donc ni le paquet npm 0.1.17-alpha ni les archives finales de la 0.1.18-alpha. Les chiffres décrivent précisément le candidat identifié, sans attribuer un nouveau benchmark aux changements ultérieurs.
Le premier VPS dispose d’un vCPU et d’environ 1,9 Gio de RAM. Le second dispose de huit vCPU et d’environ 23 Gio. Les processus testés reçoivent des plafonds CPU et mémoire via cgroup v2, sans swap. La petite machine est limitée à 70 % d’un CPU et 700 Mio ; la grande est testée avec 1 CPU et 384 Mio, 2 CPU et 1 Gio, puis 4 CPU et 2 Gio.
La matrice principale contient 96 fenêtres : quatre budgets, quatre scénarios, trois variantes et deux passages en alternance. Les variantes sont PRNext avant les corrections, le candidat PRNext testé et Next.js. Chaque fenêtre comporte cinq secondes de chauffe puis quinze secondes mesurées, avec seize connexions et gzip. Les tableaux comparent le candidat à Next.js et donnent la médiane des deux fenêtres pour chaque indicateur.
Les scénarios sont une page SSR dynamique de 100 lignes, une page de 1 000 lignes, une API JSON de seize entrées et une page avec Suspense retardé de 40 ms. Un identifiant frais et des cookies vérifient que les réponses sont correctes et isolées. Le débit compte uniquement les réponses réussies et validées. Ce n’est pas un test de pages statiques servies depuis un CDN.
Le p95 décrit le délai sous lequel se terminent 95 % des requêtes d’une fenêtre. Le CPU est exprimé en millisecondes de travail CPU par réponse réussie, pas en latence. La RAM est la mémoire proportionnelle, ou PSS, médiane de l’arbre de processus : le moteur natif et les workers Node sont inclus. Une réponse peut prendre 100 ms tout en ne consommant que quelques millisecondes de CPU.
Le générateur de charge est séparé des serveurs par ses propres limites, mais partage l’unique CPU physique du petit VPS. Les API très rapides peuvent atteindre sa limite, notamment sur la petite machine et dans le scénario à 4 CPU. Les services déjà présents restent actifs : les quotas ne suppriment pas la contention de ces VPS. Deux passages courts ne donnent pas un intervalle de confiance ; les petits écarts ne doivent pas devenir des promesses commerciales.
Avec 0,7 CPU et 700 Mio, PRNext sert 81,33 réponses SSR par seconde contre 51 pour Next.js. Son p95 est de 264,25 ms contre 420,90 ms. Le coût CPU passe de 13,39 à 8,46 ms par réponse, soit environ 37 % de moins. En revanche, la mémoire mesurée est de 113,88 Mio contre 101,38 Mio : PRNext utilise environ 12 % de plus sur cette page.
Le streaming atteint 138,13 requêtes par seconde contre 80,03, avec environ 42 % de CPU en moins par réponse. La page lourde est beaucoup plus proche : 11,33 contre 10,33 requêtes par seconde. L’API est favorable à PRNext dans cette campagne, mais le partage du CPU avec le générateur impose de garder sa limite en tête.
Sur petit écran, faites défiler le tableau horizontalement.
| Scénario / moteur | Req/s | p95 (ms) | CPU (ms/req) | RAM (Mio) |
|---|---|---|---|---|
| SSR 100 / PRNext | 81,33 | 264,25 | 8,46 | 113,88 |
| SSR 100 / Next.js | 51,00 | 420,90 | 13,39 | 101,38 |
| SSR 1 000 / PRNext | 11,33 | 1 550,25 | 58,92 | 139,51 |
| SSR 1 000 / Next.js | 10,33 | 1 661,80 | 62,10 | 119,46 |
| API JSON / PRNext | 518,17 | 61,40 | 1,27 | 139,63 |
| API JSON / Next.js | 352,80 | 90,05 | 1,94 | 113,08 |
| Streaming 40 ms / PRNext | 138,13 | 182,65 | 4,98 | 135,32 |
| Streaming 40 ms / Next.js | 80,03 | 307,25 | 8,62 | 115,54 |
Sur cette machine, PRNext consomme davantage de PSS que Next.js dans les quatre scénarios. Le bénéfice observé est principalement une meilleure efficacité CPU sur le SSR courant et le streaming. Dire simplement « moins de RAM » serait faux pour ces résultats.
Sur le grand VPS limité à 1 CPU et 384 Mio, la page SSR atteint 99,77 requêtes par seconde contre 59,90. Le coût CPU est inférieur d’environ 41 % et la PSS de 13 %. Le streaming atteint 220,90 contre 86,27 requêtes par seconde, avec 4,51 contre 11,47 ms de CPU par réponse.
La politique mémoire plus serrée du candidat réduit aussi la RAM par rapport à notre ancien PRNext, mais l’API perd environ 13 % de débit face à cet ancien code. PRNext reste devant Next.js sur cette mesure ; cela n’efface pas la régression interne. Il faut continuer à travailler sur le compromis entre collecte mémoire et débit.
Sur petit écran, faites défiler le tableau horizontalement.
| Scénario / moteur | Req/s | p95 (ms) | CPU (ms/req) | RAM (Mio) |
|---|---|---|---|---|
| SSR 100 / PRNext | 99,77 | 227,20 | 9,90 | 109,85 |
| SSR 100 / Next.js | 59,90 | 365,35 | 16,78 | 126,50 |
| SSR 1 000 / PRNext | 13,60 | 1 329,65 | 72,82 | 139,97 |
| SSR 1 000 / Next.js | 10,00 | 1 932,90 | 95,47 | 158,74 |
| API JSON / PRNext | 849,63 | 38,75 | 1,18 | 128,40 |
| API JSON / Next.js | 409,13 | 76,85 | 2,45 | 163,78 |
| Streaming 40 ms / PRNext | 220,90 | 108,50 | 4,51 | 140,27 |
| Streaming 40 ms / Next.js | 86,27 | 299,30 | 11,47 | 167,14 |
Avec 2 CPU et 1 Gio, la page SSR de 100 lignes passe à 224,70 requêtes par seconde pour PRNext contre 142,97 pour Next.js. Cela représente 57 % de débit supplémentaire, environ 26 % de CPU en moins par réponse et 32 % de PSS en moins. Le p95 est de 89,80 ms contre 154,60 ms.
La page de 1 000 lignes inverse le résultat : Next.js atteint 27,63 requêtes par seconde contre 24 pour PRNext, avec un p95 de 622,20 ms contre 740,80 ms. PRNext utilise moins de RAM, mais environ 29 % de CPU supplémentaire par réponse. Le rendu React lourd reste un axe d’amélioration concret.
Sur petit écran, faites défiler le tableau horizontalement.
| Scénario / moteur | Req/s | p95 (ms) | CPU (ms/req) | RAM (Mio) |
|---|---|---|---|---|
| SSR 100 / PRNext | 224,70 | 89,75 | 7,57 | 117,50 |
| SSR 100 / Next.js | 142,97 | 154,55 | 10,29 | 173,30 |
| SSR 1 000 / PRNext | 24,00 | 740,75 | 64,42 | 164,17 |
| SSR 1 000 / Next.js | 27,63 | 622,25 | 49,91 | 198,96 |
| API JSON / PRNext | 2 078,33 | 14,00 | 0,83 | 144,80 |
| API JSON / Next.js | 1 001,40 | 28,25 | 1,22 | 203,93 |
| Streaming 40 ms / PRNext | 341,00 | 55,15 | 4,40 | 154,70 |
| Streaming 40 ms / Next.js | 218,67 | 105,00 | 6,31 | 206,20 |
Le streaming conserve un gain de débit d’environ 56 % et un coût CPU inférieur d’environ 30 %. Ces résultats concernent cette application dynamique, ce profil et ce budget, pas tous les projets React.
Pour le budget de 4 CPU et 2 Gio, PRNext utilise deux workers. Next.js utilise deux processus derrière un proxy Node privé ; le CPU et la RAM de ce proxy sont comptés. Les trois autres budgets utilisent des serveurs directs. Cette différence de topologie doit accompagner la lecture des chiffres.
PRNext atteint 383,30 requêtes SSR par seconde contre 247,13 pour cette référence Next.js. Sa PSS est de 206,60 Mio contre 458,33 Mio. L’écart ne prouve pas une économie universelle de 55 % de RAM : une autre topologie ou un proxy différent pourrait modifier le résultat. L’API peut également être limitée par le générateur.
Sur petit écran, faites défiler le tableau horizontalement.
| Scénario / moteur | Req/s | p95 (ms) | CPU (ms/req) | RAM (Mio) |
|---|---|---|---|---|
| SSR 100 / PRNext | 383,30 | 56,35 | 8,49 | 206,60 |
| SSR 100 / Next.js | 247,13 | 133,50 | 11,80 | 458,33 |
| SSR 1 000 / PRNext | 46,37 | 450,10 | 68,28 | 272,22 |
| SSR 1 000 / Next.js | 45,50 | 688,85 | 62,55 | 520,04 |
| API JSON / PRNext | 3 421,17 | 8,20 | 0,91 | 242,97 |
| API JSON / Next.js | 1 582,60 | 24,05 | 1,90 | 525,35 |
| Streaming 40 ms / PRNext | 356,90 | 48,45 | 5,09 | 262,35 |
| Streaming 40 ms / Next.js | 313,77 | 68,75 | 7,98 | 542,40 |
Le candidat perd environ 10 % de débit SSR face à notre ancien PRNext sur ce budget, et environ 6 % sur la page lourde. Ajouter des CPU ne garantit donc pas que tous les chemins progressent. La montée en charge et les allocations du rendu lourd restent à améliorer.
Un site peu visité ne passe pas sa journée à saturer le processeur. Sa mémoire au repos peut devenir plus importante que son débit maximal. PRNext peut arrêter ses workers Node après une période d’inactivité tout en conservant le serveur Rust à l’écoute. La prochaine requête de rendu recrée les workers nécessaires.
Nous avons testé ce mécanisme sur le petit VPS avec une page SSR simple et un délai d’inactivité accéléré à deux secondes. La mesure est prise après l’arrêt des workers, observé après environ deux secondes ; le contrôle maintenu à chaud attend environ six secondes. Il s’agit d’une sonde fonctionnelle unique par réglage, distincte des tests de charge et d’endurance.
Sur petit écran, faites défiler le tableau horizontalement.
| Réglage PRNext | RAM au repos (Mio) | Requête de réveil (ms) |
|---|---|---|
| Workers arrêtés au repos | 10,5 | 1 130,0 |
| Préchauffage puis arrêt au repos | 10,4 | 1 126,6 |
| Préchauffage et maintien à chaud | 106,8 | 22,6 |
Dans cette sonde, la PSS descend autour de 10,5 Mio quand les workers sont arrêtés, contre 106,8 Mio en maintien à chaud. Le prix est visible sur la requête de réveil : environ 1,13 seconde contre 22,6 ms. Ces 10,5 Mio décrivent l’arbre de processus de cette petite application dans cet état. Ce n’est ni la consommation totale du VPS ni une promesse pour toutes les applications.
Le préchauffage au lancement, avec --prewarm, prépare le framework avant d’accepter les requêtes. Il n’empêche pas un arrêt ultérieur au repos et n’exécute pas les pages ni les API applicatives. Pour conserver les hôtes de rendu utilisés, le réglage explicite est --worker-idle-seconds 0. Choisir le préchauffage seul ne supprime donc pas le coût d’un réveil après mise en veille.
Aucun mode de mise en veille équivalent n’a été configuré pour Next.js dans cette sonde. Nous ne concluons pas que Next.js ne peut pas être arrêté ou relancé par une infrastructure externe.
Pour plusieurs petits projets consultés à des moments différents, libérer la mémoire des workers inactifs peut laisser davantage de place aux applications actives. Une meilleure efficacité CPU peut aussi laisser plus de travail utile dans le même quota. C’est un intérêt possible pour les sites vitrines, les environnements de démonstration et les outils internes intermittents.
Ce raisonnement reste une conséquence possible des mesures, pas un test de densité d’hébergement. Nous n’avons pas déterminé combien de projets supplémentaires tiennent sur un serveur, ni mesuré une facture ou une économie d’énergie. Le système, la base de données, la passerelle, les pointes simultanées et les réveils consomment eux aussi des ressources.
Le framework possède également une commande locale prnext host qui peut mettre une application entière en veille derrière une passerelle. C’est un mécanisme distinct de l’arrêt des workers mesuré ici. La passerelle demeure active ; les requêtes et connexions suivies protègent le travail en cours, puis une nouvelle visite peut réveiller l’application. Cette campagne ne chiffre pas son coût global.
La mise en veille détruit l’état conservé uniquement dans les processus. Les données durables doivent rester sur disque ou dans un service adapté ; un travail de fond non suivi ne doit pas dépendre d’un processus maintenu vivant. Le service managé PRNext Host est encore une autre couche : cet article ne mesure pas ses tarifs ni ses performances de déploiement.
Six essais de charge mixte de dix minutes couvrent les trois variantes sur les deux VPS. Chaque essai est suivi de trente annulations de streaming puis de 46 secondes au calme. Aucun échec de contenu, aucune erreur de charge et aucun arrêt pour dépassement mémoire du serveur testé n’ont été observés dans ces campagnes finales.
Sur petit écran, faites défiler le tableau horizontalement.
| VPS / moteur | Req/s | RAM première minute (Mio) | RAM dernière minute (Mio) |
|---|---|---|---|
| Petit / PRNext | 255,6 | 125,3 | 131,3 |
| Petit / Next.js | 202,3 | 106,5 | 114,8 |
| Grand / PRNext | 348,5 | 119,0 | 130,4 |
| Grand / Next.js | 317,6 | 152,5 | 158,0 |
Une première tentative d’endurance a révélé une rétention mémoire dans le générateur de charge, pas dans le serveur testé. Après correction de l’outil, les six essais finaux ont été rejoués intégralement avec le même générateur corrigé. Le lien vers cet outil pointe sur le commit fb59284, distinct du commit du moteur mesuré.
La mémoire continue de varier : sur le grand VPS contraint, PRNext passe de 119,0 à 130,4 Mio entre la première et la dernière minute. Son débit mixte est d’environ 12 % inférieur à celui de notre ancien PRNext sur cette configuration. Dix minutes ne prouvent ni l’absence de fuite ni la stabilité sur plusieurs semaines.
Après annulation et attente, les descripteurs de fichiers PRNext retombent à 44. Cette observation ne suffit pas à déclarer une fuite, ni à l’exclure à long terme. Les vérifications navigateur ajoutent 48 contextes chronométrés et dix contrôles fonctionnels, dont des replis forcés. Elles ne démontrent pas une compatibilité complète avec tous les projets Next.js.
L’argument le plus solide est l’efficacité CPU du SSR courant et du streaming dans plusieurs budgets restreints. La mémoire peut aussi être favorable, mais elle ne l’est pas sur le petit VPS physique de cette campagne. Le mode sleep apporte un choix supplémentaire pour les projets intermittents : libérer de la RAM ou préserver une réponse chaude.
Les prochaines priorités sont les allocations du rendu lourd, l’hydratation, les régressions de débit sous certains budgets et la montée en charge à plusieurs workers. Les quelques mesures de compilation de cette campagne ne suffisent pas non plus à annoncer une amélioration générale des builds.
PRNext reste expérimental et sa compatibilité Next.js est partielle. Pour décider s’il convient à votre application, reproduisez ses routes coûteuses, son trafic, ses périodes creuses et ses réveils avec un artefact identifié. Les données de cet article donnent un point de départ vérifiable, pas un classement universel des frameworks.
PRNext 0.1.18-alpha: published release / version publiée (nouvel onglet)
Benchmark data / Données du benchmark (JSON) (nouvel onglet)
PRNext: measured source / code mesuré (2856155) (nouvel onglet)
Application fixture / application de test (nouvel onglet)
Corrected load generator / générateur corrigé (fb59284) (nouvel onglet)
PRNext: rendering, prewarming and worker retirement (nouvel onglet)