Forge
sv

Forge / Linux · 17–18 Oct 2026

Benchmarks

Samma arbete, samma trafik. Utforska de dokumenterade mätningarna, förstå metoden och upprepa varje test.

192Slutförda mätningar
3Upprepningar per scenario
0 / 0 / 0Fel, timeouts eller misslyckade svar
Node.js 24Kit: Node.js 24.15.0192 · Slutförda mätningarSlutförd: 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

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.

RSS under belastning · 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
Alla mått för det här scenariot
FrameworkUtgångs-RSS · MiBRSS under belastning · MiBRSS efter belastning · MiBCPU · %Latens p99 · msMålets täckning · %Friska körningar
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

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.

Minnet under en mätning · Total.js 5 · 10501001502000 s23 s45 s68 s90 s113 sMiB
RSSJS heapBelastningÅterhämtning

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.json

Kommandot 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

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.

Ladda ner hela testsatsen

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