Performances (mesurées)
Des chiffres réels, pas une intuition — mesurés sur ce déploiement. Le plancher d'interactivité de bext (le JS qu'un client paie pour rendre un îlot interactif) est de l'ordre du kilo-octet, et zéro avant interaction en mode paresseux.
JS d'interactivité, compressé (gzip)
Ce qu'un client télécharge pour rendre un compteur interactif. Le runtime de reprise (~3 Ko) est mis en cache une seule fois pour tous les îlots et toutes les pages ; chaque îlot supplémentaire n'ajoute que ~0,6 Ko — ou rien jusqu'à l'interaction.
Tête-à-tête : la même app dans cinq frameworks (mesuré)
Nous avons construit la même app — grille de 24 produits rendue côté serveur + compteur, bascule de thème et filtre de recherche, le tout vérifié dans un vrai navigateur — dans les cinq frameworks, puis forcé chacun à rendre à neuf à chaque requête (aucun cache, aucun pré-rendu ; prouvé par un horodatage qui change à chaque requête). Builds et serveurs de production sur activ-2 ; RPS/TTFB via oha -c 50.
| Framework | JS client (gzip) | TTFB | RPS (non caché) | p99 | Build |
|---|---|---|---|---|---|
| bext (PRISM) | 5,6 Ko | 6,0 ms | 4 742 | 71 ms | ~4 Ko* |
| Astro | 0,33 Ko | 12,3 ms | 3 807 | 20 ms | 432 Ko |
| Remix | 101 Ko | 12,2 ms | 1 011 | 75 ms | 335 Ko |
| Qwik | 35 Ko | 42,6 ms | 938 | 73 ms | 249 Ko |
| Next.js | 145 Ko | 21,1 ms | 575 | 141 ms | 5,2 Mo |
Time to First Byte
Rendu Rust + cache ISR. La page de reprise complète part en ~18 ms (octet et total confondus sur le réseau local), sur trois requêtes chaudes.
Méthode (reproductible)
# interactivity floor — gzipped bytes a client actually pays
curl -s https://demo.bext.dev/islands/ResumableCounter.js | gzip -c | wc -c # 589
curl -s https://demo.bext.dev/islands/__resume-runtime.js | gzip -c | wc -c # 2970 (cached once)
# TTFB (Rust + ISR cache) — three warm samples
for i in 1 2 3; do curl -s -o /dev/null \
-w '%{time_starttransfer}s\n' https://demo.bext.dev/examples/resumability; done
# → 0.018s 0.020s 0.019s
# full harness (TTFB + JS bytes + request count per page)
node harnesses/browser/bench.mjs