Forge
nl

Forge / Linux · 17–18 Oct 2026

Benchmarks

Hetzelfde werk, hetzelfde verkeer. Verken de vastgelegde metingen, begrijp de methode en herhaal elke test.

192Voltooide metingen
3Herhalingen per scenario
0 / 0 / 0Fouten, time-outs of mislukte antwoorden
Node.js 24Kit: Node.js 24.15.0192 · Voltooide metingenVoltooid: 2026-10-18 13:56:39 UTC

Total.js 4 0.0.99 · Express 5.3.0 · Fastify 5.12.7 · generator 8.0.0 · Meteor 3.5.2 · AdonisJS 6.21.0 · NestJS · Express 12.1.3 · Total.js 5 0.0.19

Vergelijk hetzelfde scenario

RSS tijdens de belasting · MiB

De balken tonen de mediaan van drie herhalingen. De lijnen tonen het minimum en maximum. Geheugen is de RSS van het proces in MiB; elke as begint bij nul. De volgorde van de frameworks is vast en geen ranglijst.

RSS tijdens de belasting · MiB0.047.995.8143.7191.6Total.js 4: 159.3 [150.1–167.0]Total.js 4159.3Total.js 5: 165.7 [164.9–166.7]Total.js 5165.7Express: 90.8 [90.4–91.5]Express90.8Fastify: 91.2 [91.0–91.6]Fastify91.2Node.js http: 67.9 [67.5–69.8]Node.js http67.9Meteor: 168.6 [167.6–171.1]Meteor168.6AdonisJS: 145.3 [144.6–149.7]AdonisJS145.3NestJS · Express: 129.6 [129.4–130.0]NestJS · Express129.6
Alle metrieken van dit scenario
FrameworkBegin-RSS · MiBRSS onder belasting · MiBRSS na de belasting · MiBCPU · %Latentie p99 · msDoeldekking · %Gezonde runs
Total.js 461.0 [60.9–61.1]159.3 [150.1–167.0]174.3 [172.9–174.5]7.9 [7.8–8.2]5.0 [5.0–5.0]100.0 [100.0–100.0]3/3
Total.js 562.8 [62.8–63.2]165.7 [164.9–166.7]173.8 [173.1–174.3]8.2 [8.1–8.2]6.0 [6.0–6.0]100.0 [100.0–100.0]3/3
Express74.1 [73.9–74.2]90.8 [90.4–91.5]90.9 [90.5–91.6]7.3 [7.1–7.6]5.0 [4.0–5.0]100.0 [100.0–100.0]3/3
Fastify75.9 [75.4–76.8]91.2 [91.0–91.6]91.2 [91.0–91.6]4.9 [4.9–5.0]3.0 [3.0–3.0]100.0 [100.0–100.0]3/3
Node.js http50.2 [50.2–50.2]67.9 [67.5–69.8]67.9 [67.7–70.0]4.4 [4.4–4.5]3.0 [3.0–3.0]100.0 [100.0–100.0]3/3
Meteor124.3 [123.4–125.5]168.6 [167.6–171.1]169.0 [168.5–172.3]12.8 [12.7–12.8]10.0 [8.0–18.0]100.0 [100.0–100.0]3/3
AdonisJS114.3 [113.6–115.4]145.3 [144.6–149.7]145.3 [144.6–149.6]10.7 [10.4–10.7]6.0 [6.0–7.0]100.0 [100.0–100.0]3/3
NestJS · Express100.4 [99.3–101.3]129.6 [129.4–130.0]129.8 [129.4–130.2]8.5 [8.5–8.6]5.0 [5.0–13.0]100.0 [100.0–100.0]3/3
Node.js
Total.js 4 · v24.14.1
Total.js 5 · v24.15.0
Express · v24.14.1
Fastify · v24.14.1
Node.js http · v24.14.1
Meteor · v24.15.0
AdonisJS · v24.15.0
NestJS · Express · v24.15.0

De waarden zijn de mediaan [minimum–maximum] over de herhalingen. Elke RSS-waarde is een mediaan binnen de fase; bemonsterde pieken blijven in de ruwe gegevens. De beginwaarde volgt op de gereedheidsverzoeken en is dus geen geheugen zonder enig verzoek. CPU is een percentage van één logische CPU in het bemonsterde venster. p99 beschrijft voltooide verzoeken; lees het samen met de fouten en de doeldekking.

Geheugen tijdens één meting

Eén nieuw proces, elke seconde bemonsterd. De gearceerde vensters tonen belasting en herstel; opwarmen en stabiliseren gaan aan de belasting vooraf. RSS omvat runtime, heap en native geheugen. Het is niet de actieve JavaScript-heap.

Geheugen tijdens één meting · Total.js 5 · 10501001502000 s23 s45 s68 s90 s113 sMiB
RSSJS heapBelastingHerstel

De kit downloaden en je computer voorbereiden

Uitvoeren na het voorbereiden van de testkit

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --frameworks totaljs --workloads hello --rates 1000 --seconds 60 --warmup 15 --rest 30 --reps 3 --connections 32 --out /results/my-run.json

De opdracht gebruikt de bevroren suite van de gekozen run. Breng hardware, containerlimieten en achtergrondactiviteit op één lijn voordat je een nieuwe uitvoering vergelijkt. Controleer daarna met de bijbehorende v2/verify.cjs.

Hoe lees je het resultaat

Vergelijk dezelfde belasting bij hetzelfde doeltempo en lees latentie, CPU, geheugen, fouten en doeldekking samen. Ook de runtimeversie telt. Deze metingen tonen niet aan dat één framework altijd minder middelen gebruikt. Total.js 4 en 5 worden apart getoond; elk gebruikt zijn vastgelegde implementatie en runtime.

Wat is gemeten

Acht adapters, vier belastingen en gemeenschappelijke doelen van 100 en 1.000 verzoeken/s: 192 metingen. Elke meting start een nieuw productieproces: antwoordcontrole, 1,5 s basis, 15 s opwarmen, 6 s stabiliseren, 60 s belasting en 30 s herstel. Alle drie de herhalingen blijven bewaard. De adapters zijn na elkaar gemeten. De inhoud van geslaagde antwoorden wordt voor en na de belasting gecontroleerd; de generator vraagt tot 32 verbindingen aan.

Total5 gebruikt een compact NEWSCHEMA en een directe controller om JSON te valideren; kleine JSON-antwoorden geeft de controller direct terug. De vergelijking bevat volledige vastgelegde scenario’s, nooit het beste cijfermatige resultaat. Meteor gebruikt zijn productiebundle alleen voor de server; NestJS zijn Express-adapter. Native validators dekken de gemeten inhoud; afwijzing en conversie kunnen per framework verschillen.

Omgeving

Gedeelde Linux x64-host, Intel Core i7-6700. Elke metingcontainer was beperkt tot 2 logische CPU’s en 2 GiB, zonder extern netwerk en gepubliceerde poorten. De generator en de gesimuleerde afhankelijkheid deelden de container. Node 24.14.1 is gebruikt voor Total4, Express, Fastify en Node http; Node 24.15.0 voor Total5, Meteor, AdonisJS en NestJS, passend bij de runtime van de Meteor-bundle. De runtimeversies staan naast elk framework: verschillen zijn niet alleen aan het framework toe te schrijven. Productiediensten bleven op de host draaien.

Wat deze resultaten niet aantonen

Dit is een experiment met een vast tempo en een gesloten lus, geen ranglijst van maximale doorvoer. Het halen van het ingestelde doel toont niet aan hoe een adapter omgaat met onafhankelijke aankomsten of verzadiging. Er was enige beperking van de CPU door quota, vastgelegd in de review. Drie korte herhalingen tonen geen stabiliteit op lange termijn, geen afwezigheid van geheugenlekken, geen productiebeveiliging, geen gedrag van Flow en geen geheugengebruik op de Raspberry Pi aan. Garbage collection is niet geforceerd. RSS kan gereserveerd blijven nadat het verkeer is gestopt.

Een cel is gezond wanneer de voltooide verzoeken minstens 95% van het doel × de duur van de generator halen, p99 maximaal 250 ms is en het aantal fouten, time-outs en niet-2xx-antwoorden nul is. Deze drempel beweert geen gelijke maximale capaciteit.

Oorspronkelijk bewijs

Review van integriteit en omgeving · SHA-256-controlesommen · JSON · Markdown

Reproduceren en controleren

Gebruik een lege map met Docker (Linux-containers), curl en tar. Node.js is op de host niet nodig: zowel de controle van de controlesom als de testsuite gebruiken Node 24.15.0 in Docker. De eerste build downloadt afhankelijkheden en compileert Meteor, wat enkele minuten kan duren. De voorbereiding heeft internet nodig; de testcontainers hebben geen extern netwerk. Elk gemeten scenario duurt ongeveer zes minuten.

De kit draait alle acht adapters op Node v24.15.0. De gepubliceerde metingen behouden hun oorspronkelijke runtimes, getoond in de tabel.

De volledige testkit downloaden

1. Downloaden en voorbereiden. De link bevat de runner, de adapters en de afhankelijkheidsvergrendelingen; je hoeft Forge niet te installeren of een repository te klonen. Voer in een lege map de volgende opdrachten uit. Als je met de knop hebt gedownload, houd dan de bestandsnaam sources.tar.gz en sla curl over.

curl --fail --location --output sources.tar.gz 'https://forge.totaljs.es/benchmarks/node-24.15.0/sources.tar.gz' &&
docker run --rm --platform linux/amd64 --network none -v "$PWD:/kit:ro" node:24.15.0-bookworm node -e 'const fs=require("node:fs"),crypto=require("node:crypto");if(crypto.createHash("sha256").update(fs.readFileSync("/kit/sources.tar.gz")).digest("hex")!=="65801cd865a3fc961e69ba8df421ed198acdc399d29934714fb954e4de1db651")throw Error("SHA-256 mismatch");' &&
tar -xzf sources.tar.gz &&
docker build --platform linux/amd64 -t forge-benchmark-local . &&
mkdir -p results

2. De installatie controleren (ongeveer 15–30 seconden). Deze korte test maakt smoke.json en controleert de vastgelegde invoer; het is geen publiceerbaar prestatieresultaat.

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --smoke --frameworks totaljs --workloads hello --rates 1000 --out /results/smoke.json
docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/verify.cjs /results/smoke.json --allow-smoke

3. De gekozen meting uitvoeren en controleren. De resultaten worden opgeslagen in results/my-run.json in de gekozen benchmarks-map. De runner weigert bestaande uitvoer te overschrijven: gebruik voor een herhaling een andere bestandsnaam. De controle toetst volledigheid en invoer, niet gelijkheid met de gepubliceerde cijfers.

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --frameworks totaljs --workloads hello --rates 1000 --seconds 60 --warmup 15 --rest 30 --reps 3 --connections 32 --out /results/my-run.json
docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/verify.cjs /results/my-run.json