Skip to content

Сравнение производительности ​

JSON: обновлён 2026-10-04. Один рабочий процесс приложения и восемь потоков выполнения.

Замеры базы данных: PostgreSQL — выборка 20 строк из 1 000 000 записей. PostgreSQL и статика используют отдельные конфигурации, описанные в соответствующих разделах.

Обработка JSON ​

Серия девяти фреймворков — 2026-10-03, cwfr обновлён 2026-10-04 ​

Обработчик POST /count получает ровно 1 048 576 байт (1 МиБ) UTF-8 JSON, полностью разбирает документ и возвращает {"count":4097}. В объекте есть вложенные объекты/массивы, Unicode, экранированные строки и разные типы значений. Считаются ключи первого уровня; результат и дерево JSON между запросами не кешируются.

Характеристики ПК ​

Intel Core i7-12700F, Linux host network.

Приложения и nginx:

  • CPU 0–7 (четыре физических P-ядра с SMT),
  • 2 ГиБ на контейнер приложения
  • nofile 65536

wrk:

  • восемь потоков на CPU 8–15

Общий nginx имеет два воркера и один upstream-адрес на приложение, ограничивает тело 2 МиБ, не буферизует тело и не кеширует ответы.
TLS, сжатие, access log и БД отключены.

cwfr держит тело запроса в памяти.
Rails — ActionController::Metal.
Laravel использует разобранный JSON запроса и проход json_validate.
facil.io применяет native FIOBJ JSON;
Kore держит запроса тело в памяти и полностью строит дерево Jansson в фоновой задаче.

90 замеров в одной серии: девять фреймворков, два уровня конкурентности и пять повторов.

Всё сравнение повторено со сбором RSS: первичный прогрев 30 с, перед каждым замером 5 с, пять повторов по 15 с при 16/64 keep-alive соединениях, порядок перемешан с seed 20261003.

16 соединений ​

Фреймворкreq/smin–max req/sp50, мсp95, мсp99, мсCPU приложения/запрос, мксCPU прокси/запрос, мксRSS медиана, МиБ
cwfr (C)1 9971 835–2 0557,8511,2813,013 21144960,82
Spring Boot (Java)1 7231 721–1 7598,9712,2414,404 107381586,71
Laravel (PHP)840758–87418,8622,5729,939 023446293,07
facil.io (C)734474–86216,351 120,071 637,766 41437834,00
Fiber (Go)638568–65723,1446,0961,4911 63237482,55
Fastify (JavaScript)618593–62622,5562,0391,5911 682420490,80
Ruby on Rails (Ruby)283196–28654,0369,6894,194 108318226,82
Kore + Jansson (C)217177–21873,2491,56104,4420 63531434,18
Django (Python)194179–19781,26102,92114,285 52330686,62

64 соединений ​

Фреймворкreq/smin–max req/sp50, мсp95, мсp99, мсCPU приложения/запрос, мксCPU прокси/запрос, мксRSS медиана, МиБ
cwfr (C)1 9081 809–1 97833,4039,5846,133 35247084,82
Spring Boot (Java)1 7271 397–1 77837,4641,3143,924 124379579,70
facil.io (C)828626–92568,221 157,881 896,616 80237837,80
Laravel (PHP)823680–86576,6883,70112,999 082474315,58
Fiber (Go)679652–68375,31325,90493,5611 145381200,59
Fastify (JavaScript)595475–62791,26314,57568,0012 648417540,44
Ruby on Rails (Ruby)267189–271236,56274,93295,044 350315241,94
Kore + Jansson (C)210186–217295,67388,88448,1621 97632073,18
Django (Python)179130–183347,78374,67517,216 00032788,33

В этой серии срабатывал общий лимит памяти cgroup: facil.io (C): memory.events max=165877, oom=0, oom_kill=0. Reclaim мог влиять на задержки; его точный вклад отдельно не выделен. Эти счётчики не характеризуют RSS процесса.

Память и ограничения замеров ​

RSS — сумма VmRSS всех процессов приложения в контейнере, включая управляющие процессы; потоки отдельно не суммируются. Выборки снимаются каждые 200 мс во время измеряемой нагрузки. В таблице медиана медиан RSS пяти повторов, в МиБ (1 048 576 байт).

Измеренные версии ​

  • cwfr (C): 5da69b013eec43a06f9cb61f4e2c681fadeb3f9e; Release; 1 × (1 event worker + 8 handler threads)
  • Fastify (JavaScript): v24.21.0; Fastify 5.6.2; 1 × 8 Worker Threads; V8 old/young heap limits 64/8 MiB per thread
  • Django (Python): Python 3.13.16; Django 5.2.7; Gunicorn 23.0.0; 1 × 8 gthread
  • Spring Boot (Java): Spring Boot 3.5.7; openjdk version "21.0.12.1" 2026-08-18 LTS; 1 × 8 Tomcat threads
  • Fiber (Go): go1.25.14; Fiber 3.0.0; encoding/json; 1 × GOMAXPROCS=8
  • Ruby on Rails (Ruby): Ruby 3.4.11; Rails 8.0.2; Puma 6.6.1; 1 × 8 threads
  • Laravel (PHP): PHP 8.4.26 ZTS; Laravel 12.69.3; Octane v2.20.0; FrankenPHP v1.12.7 PHP 8.4.26 Caddy v2.11.4 h1:XKxkMTgNSizEvKG6QHue6cAsFOteU2qA61w2tKkCWi0=; 1 × 8 PHP worker threads; cached request JSON + json_validate
  • facil.io (C): facil.io 0.7.6; 512a354dbd31e1895647df852d1565f9d408ed91; native FIOBJ JSON; 1 process + 8 reactor/handler threads
  • Kore + Jansson (C): Kore 4.3.0; source SHA256 94f767eb113f2c97a133b9609c78c4e3795c420dc8726154edce49965df6b8ed; Jansson 2.14-2; 1 worker + 8 task threads
  • gateway: nginx version: nginx/1.28.0; 2 workers

PostgreSQL: выборка raw SQL ​

Дата серии: 2026-10-04.

Ядро CWFR: 5da69b013eec43a06f9cb61f4e2c681fadeb3f9e. main.body_store: mode: "auto", file_threshold: 5000000 байт. Маленькое тело POST остаётся в памяти; лимит тела — 2097152 байт.

Запрос POST /db принимает {"category":42,"after":1000} и возвращает двадцать упорядоченных строк с полями id, category, name, price_cents и active.
Отдельный PostgreSQL 17.6 содержит 1 000 000 синтетических записей, составной B-tree индекс по (category, id).
Оба значения передаются через bind-параметры драйвера. ORM, кеш ответа приложения, TLS и PgBouncer не используются.
Исполнение SQL, чтение всех двадцати строк, преобразование типов и сериализация JSON входят в измерение.

sql
SELECT id, category, name, price_cents, active
FROM bench_items
WHERE category = $1::integer AND id > $2::integer
ORDER BY id
LIMIT 20;

Запрос и набор выбираемых полей эквивалентны во всех приложениях.
Синтаксис placeholder адаптирован к драйверу.
Восемь потоков клиента используют восемь разных фиксированных пар параметров с диапазонами по всей таблице, одна пара на поток.
Каждый ответ сравнивается с полным ожидаемым документом из двадцати строк для этого потока.
Пустая выборка и неверные параметры проверены на прямом порту приложения и через прокси.

PostgreSQL · 16 соединений ​

Фреймворкreq/smin–max req/sp99, мсCPU приложения/запрос, мксCPU БД/запрос, мксApp anon медиана, МиБApp working set пик, МиБRSS приложения медиана, МиБ
Fiber (Go)52 76350 348–54 1800,82531057,519,217,32
facil.io (C)48 18047 251–48 5240,686310016,319,223,32
cwfr (C)46 07043 551–49 4232,277210611,516,223,09
Kore + Jansson (C)41 38838 724–41 6590,8987997,615,119,21
Spring Boot (Java)40 29138 462–44 8751,5887109373,5416,3396,48
Fastify (JavaScript)31 82928 445–33 2592,0714494356,6373,3405,11
Laravel (PHP)5 8845 835–5 9604,401 193130357,0577,2453,18
Django (Python)2 4882 365–2 4979,364627845,268,272,71
Ruby on Rails (Ruby)1 9521 735–2 08957,4660610463,9106,478,84

PostgreSQL · 64 соединений ​

Фреймворкreq/smin–max req/sp99, мсCPU приложения/запрос, мксCPU БД/запрос, мксApp anon медиана, МиБApp working set пик, МиБRSS приложения медиана, МиБ
Fiber (Go)48 91648 244–49 2431,94571127,819,917,50
cwfr (C)47 92947 218–48 6033,186910911,516,423,08
facil.io (C)44 05541 626–46 3172,406511116,119,323,21
Spring Boot (Java)43 11537 807–43 1172,2682109372,7416,0395,71
Kore + Jansson (C)38 83537 157–41 2903,25891118,015,419,58
Fastify (JavaScript)34 09830 049–36 7476,03161108354,2373,6402,64
Laravel (PHP)5 5615 105–5 84414,901 245158482,7670,6578,88
Django (Python)2 4972 406–2 50330,044627945,268,572,77
Ruby on Rails (Ruby)1 9651 862–2 060302,0861210961,7103,676,59

Память до и после нагрузки ​

Сохранены idle-снимки перед явным прогревом и после прогрева всех фреймворков, а также снимки до/после каждого прогона.
Память БД включает сервер и idle-соединения всех фреймворков.
В raw data отдельно для приложения, БД и прокси есть медианы и пики current/anon/working set; RSS каждого PID и суммы по контейнерам сохранены отдельно.

КонтейнерIdle до прогрева, МиБПосле прогрева, МиБПосле последнего прогона, МиБПик под нагрузкой, МиБ
cwfr (C)12,912,915,716,4
Fastify (JavaScript)370,5256,2372,7373,6
Django (Python)65,966,067,868,5
Spring Boot (Java)388,3412,4397,9416,3
Fiber (Go)16,816,918,319,9
Ruby on Rails (Ruby)99,0100,487,0106,4
Laravel (PHP)235,8331,0671,2670,6
facil.io (C)15,415,418,419,3
Kore + Jansson (C)16,112,613,915,4
postgres208,8209,7209,6217,4
gateway9,610,011,714,1

Измеренные версии PostgreSQL-набора ​

  • cwfr: {"core_source": "5da69b013eec43a06f9cb61f4e2c681fadeb3f9e", "libpq": "libpq5:amd64\t18.6-0ubuntu0.26.04.1"}
  • fastify:
  • django: 3.13.16 5.2.7 3.2.13
  • spring: openjdk version "21.0.12.1" 2026-08-18 LTS OpenJDK Runtime Environment Temurin-21.0.12.1+1 (build 21.0.12.1+1-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.12.1+1 (build 21.0.12.1+1-LTS, mixed mode, sharing)
  • fiber:
  • rails: 3.4.11; 8.0.2; 1.6.2; 6.6.1
  • laravel: PHP 8.4.26; Laravel 12.69.3; Octane v2.20.0; pdo_pgsql

PDO Driver for PostgreSQL => enabled PostgreSQL(libpq) Version => 15.19

  • facil: facil.io 0.7.6; 512a354dbd31e1895647df852d1565f9d408ed91; libpq/Jansson; 1 process + 8 reactor/handler threads; libjansson4:amd64 2.14-2 libpq5:amd64 15.19-0+deb12u1
  • kore: Kore 4.3.0; SHA256 94f767eb113f2c97a133b9609c78c4e3795c420dc8726154edce49965df6b8ed; libpq/Jansson; 1 worker + 8 task threads; libjansson4:amd64 2.14-2 libpq5:amd64 15.19-0+deb12u1
  • postgres: postgres (PostgreSQL) 17.6 (Debian 17.6-2.pgdg12+1)
  • gateway: nginx version: nginx/1.28.0
  • spring_jars: ["BOOT-INF/lib/spring-boot-3.5.7.jar", "BOOT-INF/lib/spring-boot-autoconfigure-3.5.7.jar", "BOOT-INF/lib/HikariCP-6.3.3.jar", "BOOT-INF/lib/postgresql-42.7.8.jar", "BOOT-INF/lib/spring-boot-jarmode-tools-3.5.7.jar"]

Статика: cwfr и nginx ​

Прямые HTTP/1.1 keep-alive запросы, четыре воркера, четыре физических P-ядра (CPU 0,2,4,6), 512 МиБ на сервер, буферы 16 КиБ, page cache, без gzip/access log. Клиент — CPU 8,10,12,14.
Пять повторов по 15 с с прогревом 1 с на сценарий.
Файлы: 200 Б, 20 КиБ, 1 МиБ.
Диапазоны: начальная половина, последняя четверть, multipart из первой и последней четверти.
Ниже итоговые cwfr и nginx при 64 соединениях.
Раздел на главной позволяет выбрать все четыре числа соединений и варианты диапазонов. Условия отличаются от серии JSON.

ФайлОтветcwfr, req/snginx, req/scwfr p99, мсnginx p99, мс
200 Бfull480 307500 3750,2630,667
200 Бprefix_half464 506492 7620,2770,206
200 Бsuffix_quarter463 087491 3160,2570,207
200 Бmultipart_quarters388 871400 8350,2730,210
20 КиБfull432 924464 9270,3661,138
20 КиБprefix_half428 125469 0110,3130,194
20 КиБsuffix_quarter431 635473 9360,2650,200
20 КиБmultipart_quarters333 483379 1430,3640,247
1 МиБfull25 79825 7812,5082,514
1 МиБprefix_half51 01650 6791,2671,265
1 МиБsuffix_quarter110 552101 4341,7860,687
1 МиБmultipart_quarters51 48152 0621,2731,252

Выпущено под лицензией MIT.