Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров16K

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

Недавно я задался вопросом «Какой 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 может гораздо больше. Такие вещи, как логирование, валидация, предлагаются из коробки. Гранулярность хуков, система инкапсуляции плагинов - все это не затрагивалось в статье.

Теги:
Хабы:
Всего голосов 9: ↑6 и ↓3+5
Комментарии12

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань