Нужно ли обновлять версию NodeJS в надежде на увеличение производительности?

Node.js - технология для запуска JavaScript кода вне браузера. Раньше код мог запускаться только в части фронтенда, но теперь JavaScript может исполняться на сервере, это позволяет писать серверный код для динамических веб-страниц и веб-приложений, а также для программ командной строки на этом языке.

Релизы Node.js появляются часто, новые версии выпускаются как правило в апреле и октябре. Так, самой актуальной версией сейчас является Node.js 18.3.0. Однако, изменение версии платформы влечет за собой обновление большей части пакетов, которые необходимы для корректной работы приложения. Настройка зависимостей занимает много времени, а трудозатраты на рефакторинг кода, в случае изменений синтаксиса в обновленных библиотеках, могут быть очень большими. Поэтому до сих пор используются и довольно популярны версии 12, 10 и даже 8. Насколько критично использовать версию платформы Node.js, которая перестала поддерживаться несколько лет назад, и такие ли большие изменения претерпевала технология?

101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010

Отличия производительности в версиях

Последняя анонсированная версия Node.js рассчитана на Linux-системы, включая Debian 10 и Ubuntu 20.04, а также для macOS 10.15+. Из-за проблем со сборкой движка V8, разработанного компанией Google, временно прекращено формирование 32-разрядных сборок для Windows, или потребуется использование Windows Subsystem for Linux (WSL).

Оптимизация в обновлении Node.js заключается и в улучшениях движка V8 (рис. 1), на которой и основана среда. V8 поддерживает использование динамически связанных общих объектов, написанных на C ++, в связке с JavaScript. Добавление новых функций и методов, расширение API, ускорение инициализации полей классов – всё это стало доступно в серверной JavaScript-платформе Node.js 18.0.

Динамика производительности с обновлением версии движка V8

Динамика производительности с обновлением версии движка V8

101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010

Проведение испытаний в идеальных условиях: использование только одной стартовой функции и заглушки-ответа, как это принято в базовом приложении – позволяют определить, что обновление движка способствовало увеличению производительности разных методов в среднем на 30%.

Оптимизация без повышения версии Node.js

Особый интерес представляет количество запросов, которое может обработать сервер в одну секунду – RPS (Requests Per Second). Node.js однопоточна и асинхронна. Это значит, что процедуры чтения файлов, запросы к базе данных и все другие возможные действия происходят одновременно. Среда постоянно работает и ждет подключений в один процесс, не плодя их при каждом запросе. JavaScript код выполняется в главном потоке этого процесса, а все операции ввода-вывода выполняются в других потоках практически без задержки.

Переход на более новую версию Node.js дает преимущество в производительности, но вдруг можно обойтись рефакторингом кода, который не повлечет за собой изменений в сборочных пакетах. Базовое Node.js 8 приложение в среднем способно обработать 16176 запросов в секунду. Отталкиваясь от этой цифры можно проверить производительность разных методов:

  • 1. Использование цикла for…in в качестве базового метода снижает производительность до 13330 запросов в секунду.
  • 2. Использование [].map и filter показывает результат в 13316 запросов в секунду.
  • 3. Стандартный цикл for показывает результат 16015 запросов в секунду, что намного ближе к эталону.

Ту же аналогию можно провести и с другими базовыми методами, используемыми в расчетах и обработке данных. Так, Math.round(el*100)/100 в 2 раза быстрее чем toFixed(2)

На производительность приложения влияют и следующие факторы:

  •  в Node.js многие задачи, интенсивно использующие ЦП, зависят от пула потоков. Хотя он не блокирует асинхронный ввод-вывод, он замедляет работу API, что приводит к задержкам ответов для пользователя. Запрос на регистрацию может сопровождаться хэшированием пароля, что занимает 100 мс, и для этой процедуры приходится ждать пул потоков;
  •  Node.js работает в одном потоке, поэтому производительность нашего кода напрямую влияет на все приложение. Например, использование JSON.parse может замедлить работу API. Нужно учитывать также размер данных, трафик, наличие циклов и рекурсивных функций – всё это может стать причиной возникновения проблем или недоступности приложение;
  •  базовое приложение покажет разное время исполнения при изменении частоты процессора. Так для 8-ядерного процессора с тактовой частотой 2,1 ГГц Node.js 17 покажет результат в 30 тысяч обработанных запросов в секунду, а на процессоре с частотой 3,6 ГГц число запросов возрастает до 45 тысяч.
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010
101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010 101010

Заключение

Таким образом, из проведенных экспериментов можно сделать вывод, что обновление на новые версии Node.js может существенно повысить производительность приложения. Но, рефакторинг кода и использование больших вычислительных мощностей в некоторых случаях дает не меньший прирост производительности без необходимости изменения ядра приложения.

БУДЕМ
НА СВЯЗИ

+7 (927) 988-37-48

Заказать обратный звонок

Расскажите о вашей задачи и мы предложим несколько вариантов ее решения:

Нажимая на кнопку, вы даёте согласие на обработку персональных данных и соглашаетесь с Политикой конфиденциальности