Forge
bg

Forge / Linux · 17–18 Oct 2026

Benchmarks

Същата работа, същият трафик. Разгледайте записаните измервания, разберете метода и повторете всеки тест.

192Завършени измервания
3Повторения на сценарий
0 / 0 / 0Грешки, изтичания на времето или неуспешни отговори
Node.js 24Kit: Node.js 24.15.0192 · Завършени измерванияЗавършено: 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

Сравнете същия сценарий

RSS при натоварване · MiB

Стълбовете показват медианата на три повторения. Линиите показват минимума и максимума. Паметта е RSS на процеса в MiB; всяка ос започва от нула. Редът на рамките е фиксиран и не е класация.

RSS при натоварване · 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
Всички метрики на този сценарий
FrameworkНачален RSS · MiBRSS при натоварване · MiBRSS след натоварването · MiBCPU · %Забавяне p99 · msПокритие на целта · %Здрави изпълнения
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

Стойностите са медиана [минимум–максимум] на повторенията. Всяка стойност на RSS е медиана в рамките на фазата; пробните върхове остават в суровите данни. Началната стойност следва заявките за готовност, затова не е памет изцяло без заявки. CPU е процент от един логически CPU в пробния прозорец. p99 описва завършените заявки; четете го заедно с грешките и покритието на целта.

Паметта по време на едно измерване

Един нов процес, вземан на проба всяка секунда. Засенчените прозорци отбелязват натоварването и възстановяването; преди натоварването има загряване и успокояване. RSS включва runtime, heap и собствена памет. Не е активният heap на JavaScript.

Паметта по време на едно измерване · Total.js 5 · 10501001502000 s23 s45 s68 s90 s113 sMiB
RSSJS heapНатоварванеВъзстановяване

Изтеглете комплекта и подгответе компютъра си

Изпълнете след подготовката на тестовия комплект

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

Командата използва замразения комплект на избраното изпълнение. Уеднаквете хардуера, ограниченията на контейнерите и фоновата активност, преди да сравнявате ново изпълнение. След това проверете със съответния v2/verify.cjs.

Как да четете резултата

Сравнявайте същото натоварване при същия целеви темп и четете заедно забавянето, CPU, паметта, грешките и покритието на целта. Значение има и версията на runtime. Тези измервания не доказват, че една рамка винаги използва по-малко ресурси. Total.js 4 и 5 са показани отделно; всяка използва своята записана реализация и runtime.

Какво е измерено

Осем адаптера, четири натоварвания и общи цели от 100 и 1000 заявки/s: 192 измервания. Всяко измерване стартира нов производствен процес: проверка на отговора, 1,5 s основа, 15 s загряване, 6 s успокояване, 60 s натоварване и 30 s възстановяване. Запазват се и трите повторения. Адаптерите са измервани последователно. Съдържанието на успешните отговори се проверява преди и след натоварването; генераторът иска до 32 връзки.

Total5 използва компактен NEWSCHEMA и директен контролер за валидиране на JSON; малките отговори JSON се връщат директно от контролера. Сравнението съдържа пълни записани сценарии, никога най-добрия числов резултат. Meteor използва своя производствен bundle само за сървъра; NestJS — своя адаптер Express. Роден валидатор покрива измереното съдържание; отхвърлянето и преобразуванията може да се различават между рамките.

Среда

Споделен хост Linux x64, Intel Core i7-6700. Всеки контейнер за измерване беше ограничен до 2 логически CPU и 2 GiB, без външна мрежа и публикувани портове. Генераторът и симулираната зависимост споделяха контейнера. Node 24.14.1 беше използван за Total4, Express, Fastify и Node http; Node 24.15.0 — за Total5, Meteor, AdonisJS и NestJS, в съответствие с runtime на bundle-а на Meteor. Версиите на runtime са показани до всяка рамка: разликите не могат да се приписват само на рамката. Производствените услуги останаха на хоста.

Какво не доказват тези резултати

Това е експеримент с фиксиран темп и затворен цикъл, а не класация по максимална пропускателна способност. Достигането на зададената цел не доказва как адаптерът се справя с независими постъпвания или насищане. Имаше известно ограничаване на CPU чрез квота, записано в прегледа. Три кратки повторения не доказват дългосрочна стабилност, липса на течове на памет, сигурност в производство, поведение на Flow или използване на паметта на Raspberry Pi. Събирането на боклука не беше принудено. RSS може да остане заделен след спиране на трафика.

Клетката е здрава, когато завършените заявки достигат поне 95% от целта × продължителността на генератора, p99 не надвишава 250 ms, а броят на грешките, изтичанията на времето и отговорите извън 2xx е нула. Този праг не твърди равен максимален капацитет.

Оригинални доказателства

Преглед на целостта и средата · Контролни суми SHA-256 · JSON · Markdown

Възпроизвеждане и проверка

Използвайте празна папка с Docker (контейнери Linux), curl и tar. Node.js не е нужен на хоста: проверката на контролната сума и тестовият комплект използват Node 24.15.0 в Docker. Първото изграждане изтегля зависимости и компилира Meteor, което може да отнеме няколко минути. Подготовката изисква интернет; тестовите контейнери нямат външна мрежа. Всеки измерен сценарий отнема около шест минути.

Комплектът изпълнява и осемте адаптера на Node v24.15.0. Публикуваните измервания запазват оригиналните си runtime, показани в таблицата.

Изтегляне на пълния комплект за тестове

1. Изтегляне и подготовка. Връзката съдържа изпълнителя, адаптерите и заключванията на зависимости; не е нужно да инсталирате Forge или да клонирате хранилище. В празна папка изпълнете следните команди. Ако сте изтеглили с бутона, запазете името sources.tar.gz и пропуснете 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. Проверка на инсталацията (около 15–30 секунди). Този кратък тест създава 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/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. Изпълнение и проверка на избраното измерване. Резултатите се записват в results/my-run.json в избраната папка benchmarks. Изпълнителят отказва да презапише съществуващ изход: за повторение използвайте друго име на файл. Проверката контролира пълнотата и входовете, не съвпадение с публикуваните стойности.

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