Получение до 300% больше производительности от Express Server с простым изменением
фото Макс Чен на Неспособный
Express является одной из наиболее используемых фреймворков Node.js, когда вам нужно создавать сервер.
Вот пример простого Express Server с одной конечной точкой, возвращая небольшой статический ответ JSON.
Запуск кода выше и сравнивает его, используя AutoCannon Для нескольких раз показывает сервер, работая на MacBook Pro 2018 года, обрабатывает примерно 190 тыс. Запросы за 11 секунд RPS
➜ autocannon [http://localhost:3000/not\_cached](http://localhost:3000/not_cached)
Мы можем сделать лучше!
Поскольку в этом примере так мало кода, есть только одно место, где мы можем искать лучшую производительность – экспресс -исходный код, определение функции JSON на объекте ответа (полный код, найденный по адресу: https://github .com/express/express/blob/master/lib/response.js )
Самая важная часть происходит в строке 22, строго – Для каждого Res.Json, который мы используем, возвращаемое значение строкано быть отправленным в качестве ответа HTTP. После строки данных установлен тип контента и отправляется ответ.
JSON.Stringify – это операция, связанная с процессором, а не лучший друг узла, поэтому давайте попробуем сделать это только один раз.
Мы можем осудить результат и сохранить его с переменной, и для каждого входящего запроса мы можем установить тип контента в приложение/JSON и использовать метод End, чтобы записать строку непосредственно в сокет:
Запуск AutoCannon снова дает нам около 350 тыс. Запрос за 11 секунд RP. Улучшение 80%.
Но подождите, вы пообещали мне на 300% улучшения !! И ты был бы прав!
Разница в производительности в значительной степени зависит от возвращаемого объекта. Я хотел показать, что даже небольшое изменение на небольшом объекте может быть значительным.
Попробуйте сделать то же самое с большим объектом JSON (например, 500–600 КБ), вы получите повышение производительности. На самом деле, использование res.json может фактически привести к тому, что ваш сервер сбой в ограниченной среде, такой как контейнер, работающий на Kubernetes.
Выводы
При использовании Express, если ваш сервер работает с плохой RPS, попробуйте кэшировать любой общий ответ и напишите строку непосредственно в потоку ответов вместо использования res.json, который использует json.stringify каждый раз.
Оригинал: “https://dev.to/efishtain/how-json-stringify-killed-my-express-server-3lke”