Forge / Linux · 17–18 Oct 2026
Benchmarks
Samma arbete, samma trafik. Utforska de dokumenterade mätningarna, förstå metoden och upprepa varje test.
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
Jämför samma scenario
RSS under belastning · MiB
Staplarna visar medianen av tre upprepningar. Linjerna visar deras minimum och maximum. Minnet är processens RSS i MiB; varje axel börjar vid noll. Ordningen på ramverken är fast och är ingen rangordning.
| Framework | Utgångs-RSS · MiB | RSS under belastning · MiB | RSS efter belastning · MiB | CPU · % | Latens p99 · ms | Målets täckning · % | Friska körningar |
|---|---|---|---|---|---|---|---|
| Total.js 4 | 61.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 5 | 62.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 |
| Express | 74.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 |
| Fastify | 75.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 http | 50.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 |
| Meteor | 124.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 |
| AdonisJS | 114.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 · Express | 100.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.jsTotal.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 | |||||||
Värdena är median [minimum–maximum] över upprepningarna. Varje RSS-värde är en median inom fasen; provtagna toppar finns kvar i rådata. Utgångsvärdet följer på beredskapsbegärandena och är därför inte minne helt utan begäranden. CPU är en procentandel av en logisk CPU under det provtagna fönstret. p99 beskriver slutförda begäranden; läs det tillsammans med felen och målets täckning.
Minnet under en mätning
En ny process, provtagen varje sekund. De skuggade fönstren markerar belastning och återhämtning; uppvärmning och stabilisering föregår belastningen. RSS omfattar runtime, heap och inbyggt minne. Det är inte den aktiva JavaScript-heapen.
Ladda ner satsen och förbered datorn
Kör efter att testsatsen har förberetts
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.jsonKommandot använder den frysta sviten för den valda körningen. Anpassa hårdvara, containergränser och bakgrundsaktivitet innan du jämför en ny körning. Verifiera därefter med motsvarande v2/verify.cjs.
Så läser du resultatet
Jämför samma belastning vid samma måltakt och läs latens, CPU, minne, fel och målets täckning tillsammans. Runtime-versionen spelar också roll. Mätningarna visar inte att ett ramverk alltid använder färre resurser. Total.js 4 och 5 visas separat; vart och ett använder sin dokumenterade implementation och runtime.
Vad som mättes
Åtta adaptrar, fyra belastningar och gemensamma mål på 100 och 1 000 begäranden/s: 192 mätningar. Varje mätning startar en ny produktionsprocess: svarskontroll, 1,5 s utgångsläge, 15 s uppvärmning, 6 s stabilisering, 60 s belastning och 30 s återhämtning. Alla tre upprepningarna behålls. Adaptrarna mättes en i taget. Innehållet i lyckade svar kontrolleras före och efter belastningen; generatorn begär upp till 32 anslutningar.
Total5 använder ett kompakt NEWSCHEMA och en direkt kontroller för JSON-validering; små JSON-svar returneras direkt av kontrollern. Jämförelsen innehåller kompletta dokumenterade scenarier, aldrig det bästa siffervärdet. Meteor använder sitt produktionsbundle enbart för servern; NestJS sin Express-adapter. Inbyggda validerare täcker det mätta innehållet; avvisning och konvertering kan skilja sig mellan ramverk.
Miljö
Delad Linux x64-värd, Intel Core i7-6700. Varje mätcontainer var begränsad till 2 logiska CPU:er och 2 GiB, utan externt nätverk och publicerade portar. Generatorn och det simulerade beroendet delade container. Node 24.14.1 användes för Total4, Express, Fastify och Node http; Node 24.15.0 för Total5, Meteor, AdonisJS och NestJS, i linje med runtime för Meteor-bundlet. Runtime-versionerna visas bredvid varje ramverk: skillnader kan inte tillskrivas enbart ramverket. Produktionstjänster fortsatte köra på värden.
Vad resultaten inte visar
Detta är ett experiment med fast takt och sluten slinga, inte en rangordning av maximal genomströmning. Att nå det konfigurerade målet visar inte hur en adapter hanterar oberoende ankomster eller mättnad. Viss CPU-strypning på grund av kvot förekom och noterades i granskningen. Tre korta upprepningar visar inte långsiktig stabilitet, frånvaro av minnesläckor, produktionssäkerhet, Flows beteende eller minnesanvändning på Raspberry Pi. Skräpinsamling tvingades inte. RSS kan förbli reserverat när trafiken har upphört.
En cell är frisk när de slutförda begärandena når minst 95 % av målet × generatorns varaktighet, p99 är högst 250 ms och antalet fel, timeouts och icke-2xx-svar är noll. Den här tröskeln påstår inte lika stor maximal kapacitet.
Ursprungliga belägg
Fullständig jämförelse av ramverk
Granskning av integritet och miljö · SHA-256-kontrollsummor · JSON · Markdown
Återskapa och granska
Använd en tom katalog med Docker (Linux-containrar), curl och tar. Node.js behövs inte på värden: både kontrollen av kontrollsumman och testsviten använder Node 24.15.0 i Docker. Det första bygget laddar ner beroenden och kompilerar Meteor, vilket kan ta flera minuter. Förberedelsen kräver internet; testcontainrarna har inget externt nätverk. Varje uppmätt scenario tar cirka sex minuter.
Satsen kör alla åtta adaptrar på Node v24.15.0. De publicerade mätningarna behåller sina ursprungliga runtime-versioner, som visas i tabellen.
1. Ladda ner och förbered. Länken innehåller körprogrammet, adaptrarna och beroendelåsen; ingen Forge-installation eller kloning av ett arkiv behövs. Kör följande kommandon i en tom katalog. Om du laddade ner med knappen, behåll filnamnet sources.tar.gz och hoppa över curl.
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. Kontrollera installationen (cirka 15–30 sekunder). Det korta testet skapar smoke.json och verifierar dess dokumenterade indata; det är inte ett publicerbart prestandaresultat.
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. Kör och verifiera den valda mätningen. Resultaten sparas i results/my-run.json i den valda benchmarks-katalogen. Körprogrammet vägrar skriva över befintlig utdata: använd ett annat filnamn vid en upprepning. Verifieringen kontrollerar fullständighet och indata, inte likhet med de publicerade siffrorna.
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