Понимание использования Node JS Buffer

Node.js внешний интерфейс JavaScript V8
Понимание использования Node JS Buffer

JavaScript изначально был разработан для браузеров и не имеет механизма для чтения или управления потоками двоичных данных. Введение класса Buffer дает NodeJS возможность манипулировать файловыми потоками или сетевыми двоичными потоками.

Основные понятия буфера

Выделение памяти объекта Buffer происходит не в куче памяти V8, а Node выполняет приложение памяти на уровне C++, можно понять, что часть пространства открывается в памяти, но выделение памяти при использовании это делается на уровне Node, и выпуск также автоматически контролируется механизмом gc v8 в Node. Основные операции Buffer здесь повторяться не будут, официальная документация очень подробная.

Сравнение производительности буфера

Обычно при передаче по сети данные необходимо преобразовать в буфер. Давайте проведем эксперимент по сравнению производительности.

1. Возврат клиенту с помощью простой строки

const http = require('http');

let hello = ''
for (var i = 0; i < 10240; i++) {
  hello += "a";
}

console.log(`Hello:${hello.length}`)
// hello = Buffer.from(hello);

http.createServer((req, res) => {
  res.writeHead(200);
  res.end(hello);
}).listen(8001);

использоватьab -c 200 -t 100 http://127.0.0.1:8001/Команда для выполнения теста производительности, запуска 200 одновременных клиентов

string-200

При использовании строк число запросов в секунду может достигать 4019,70 при скорости передачи 40491,45 КБ в секунду.

2. Используйте буфер. Преобразуйте строку в объект Buffer и отправьте ее клиенту.

const http = require('http');

let hello = ''
for (var i = 0; i < 10240; i++) {
  hello += "a";
}

console.log(`Hello:${hello.length}`)
hello = Buffer.from(hello);

http.createServer((req, res) => {
  res.writeHead(200);
  res.end(hello);
}).listen(8001);

Раскомментируйте преобразование буфера и используйте тот жеab -c 200 -t 100 http://127.0.0.1:8001/Тест, также инициируйте 200 одновременных клиентов.

buffer-200

При использовании Buffer количество запросов в секунду достигает 7130,05, а скорость передачи — 71822,74 КБ в секунду. Производительность составляет 177% от оригинала, что значительно экономит ресурсы сервера. Приведенный выше пример сравнения относится к «Введение в Node JS».

Итак, вопрос в том, почему такое большое улучшение производительности?

Причина на самом деле очень проста: в NodeJS при выполнении HTTP-передачи, если возвращаемый типstring, Так и будетstringПараметр типа преобразуется в Buffer и по крупицам возвращается клиенту через поток Stream в NodeJS. Если мы вернем тип Buffer напрямую, операции преобразования не будет, а вернемся напрямую, уменьшив повторное использование ЦП. См. исходный код Node для этой части логики.GitHub.com/node будет /node…

В приведенном выше примере сравнения производительности вернитеstring, каждый запрос требуетstringЗаменить его Буфером и вернуть его; а при возврате Буфера напрямую, Буфер сохраняется в памяти, когда мы запускаем сервис, и каждый запрос может напрямую возвращать Буфер в памяти, поэтому QPS до и после использования Буфер значительно улучшен.

Поэтому, когда мы пишем бизнес-код, некоторые ресурсы могут быть предварительно преобразованы в тип буфера (например, js, css и другие файлы статических ресурсов) и напрямую возвращать буфер клиенту.Например, в некоторых сценариях пересылки файлов полученный контент сохраняется, поскольку Buffer пересылается напрямую, избегая дополнительных операций преобразования.

Использованная литература: