Гонка за скоростью: сравнение производительности ведущих фреймворков JavaScript в веб-разработке. Fastify, Express, Koa

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Почему я это сделал?

Недавно я задался вопросом «Какой JS фреймворк самый быстрый?». Я обратился с этим запросом в google и нашел очевидный ответ «это Fastify!». Но почему именно он?.

Я практически сразу наткнулся на статью, результаты которой меня немного расстроили, так как в качестве дополнительной нагрузки на endpoint автор использовал вычисление ряда Фибоначчи, что, по моему мнению, не раскрывает всей сути сравнения. Тогда я решил провести собственное исследование.

Сразу оговорюсь, я не являюсь фанатом ни одного из перечисленных фреймворков, а данное исследование вызвано исключительно личным любопытством и желанием разобраться в выборе наиболее удобной и современной технологии на 2024 г. в мире JavaScript веб-фреймворков. В данной статье не сравниваются все возможности этих трех веб-фреймворков потому что тогда эта статья превратилась бы в книгу)


Тестовая среда. Базовая конфигурация, выбор инструмента сравнительного анализа.

При выборе базового кода серверных приложений и бенчмарка я доверился команде Fastify, взяв всю необходимую информацию с их сайта https://fastify.dev/benchmarks/.

Machine: 11th Gen Intel® Core™ i5-11400H @ 2.70GHz × 12, 32GB RAM, SSD
Method: autocannon -c 100 -d 40 -p 10 localhost:3000

Framework

Version

Express

4.18.1

Koa

2.14.2

Fastify

4.24.3

Итоговая конфигурация приложений.

Моей целью было протестировать производительность и поведение сервера в обыденных для веб приложения условиях.

Таким образом я остановился на написании 3 эндпоинтов для тестирования стандартных возможностей веб фреймворка:

  • Path "/". Это пустой endpoint, который возвращает json объект {hello: true} .

  • Path "/sendFile". Этот endpoint возвращает простую html страницу без CSS файлов и JavaScript скриптов.

  • Path "/json". Этот endpoint возвращает json объект размером 589 Кб.

Endpoint "/".

Express

app.get("/", (req, res) => {
  res.send({hello: true});
});

Fastify

fastify.get("/", (request, reply) => {
  reply.send({hello: true});
});

Koa

router.get('/', (ctx, next) => {
  ctx.body = {hello: true};
});

На данном этапе исследования мы получили ожидаемые результаты, которые можно сравнить с результатами, полученными командой разработчиков Fastify.

Endpoint "/json".

Express

app.get("/json", (req, res) => {
  res.json(config);
});

Fastify

fastify.get("/json", (request, reply) => {
  reply.send(config);
});

Koa

router.get('/json', (ctx, next) => {
  ctx.body = config;
});

На этом этапе мы наблюдаем интересные результаты: Fastify просто сорвал банк на пустом эндпоинте, лидируя с 72,158 RPS, в то время как Express топтался на месте с мизерными 15,484 RPS. Однако, когда пришло время обработки крупного JSON размером 589 кБ, ситуация внезапно изменилась. Fastify уступил перед Express, который забрал пальму первенства, достигнув 291 RPS, тогда как Fastify застрял на 277.

Endpoint "/sendFile".

Express

app.get("/sendFile", (req, res) => {
  res.sendFile(path.join(__dirname, '/index.html'));
});

Fastify

fastify.get("/sendFile", (request, reply) => {
  const stream = fs.createReadStream(path.join(__dirname, '/index.html'), 'utf8')
  reply.type('text/html').send(stream);
});

Koa

app.use(htmlRender('/'));

router.get('/sendFile', async (ctx, next) => {
  await ctx.html('index.html');
});

На заключительном этапе нашего тестирования мы проверили производительность веб-фреймворков при отправке HTML файла. В этот раз Fastify продемонстрировал внушительные результаты, сделав 2943 запроса в секунду. Однако Express сумел превзойти его, показав впечатляющие 6356 запросов в секунду. Эти результаты являются интересным показателем, подчеркивающим, что каждый фреймворк имеет свои сильные и слабые стороны в различных сценариях использования.

Что можно сказать в заключении?

Наверное во время прочтения сложилось впечатление, что фреймворк koa был задействован просто для веса так как упоминаний о нем действительно мало.
Но нет, все гораздо интереснее, ведь именно этот фреймворк стал лидером по моему мнению, так как именно он показал наиболее средние и стабильные результаты.

Почему же мы получили такие странные показатели Fastify?

Это не так уж удивительно, Express неплохо написан и надежен, до такой степени, что прошел через многие годы без существенных обновлений. Он настолько хорош, насколько это возможно.

Еще раз напомню: я не считаю, что Express или Koa лучшее решение для вашего следующего проекта, чем Fastify. Fastify может гораздо больше. Такие вещи, как логирование, валидация, предлагаются из коробки. Гранулярность хуков, система инкапсуляции плагинов - все это не затрагивалось в статье.

Источник: https://habr.com/ru/articles/798469/


Интересные статьи

Интересные статьи

В последнее время появляется довольно много Fullstack-фреймворков, они становятся популярны, их обсуждают.Если посмотреть на результаты The State of JS 2021 в раздел...
Программист — творческая профессия. Мы создаем что-то новое, руководствуясь своими знаниями, внутренним пониманием качества и поставленными дедлайнами. Дедлайны и знания пока оставим в сторо...
Мой опыт разработки игры «Змейка» на Brython «Погоди, что?» – думаю, большинство читателей отреагирует на заголовок именно так. В смысле «просто использовать Python в браузе...
Можно встретить много критических замечаний о том, что биологический мозг или биологические нейронные сети работают совершенно не так как ныне популярные компьютерные нейронные се...
Я пишу на питоне лет пять, из них последние три года — развиваю собственный проект. Большую часть этого пути мне помогает в этом моя команда. И с каждым релизом, с каждой новой фичей у нас вс...