1. Вступительный анализ
Так называемый буферный буфер означает «область временного хранения», которая представляет собой часть памяти, которая временно хранит входные и выходные данные.
Сам язык JS имеет только типы данных строковых данных и никаких бинарных типов данных. Следовательно, Nodejs предоставляет глобальный буфер конструктора, который является однозначным для строки для предоставления операций на двоичных данных. В дополнение к чтению файлов для получения экземпляров буфера, он также может быть построен напрямую, например:
Кода -копия выглядит следующим образом:
var buffer = новый буфер ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
Буфер похож на строку. В дополнение к использованию атрибута .length для получения длины байта, вы также можете использовать метод [Index] для чтения байтов в указанном положении, например:
Кода -копия выглядит следующим образом:
буфер [0]; // 0x68;
Буфер и строку могут быть преобразованы друг в друга, например, двоичные данные могут быть преобразованы в строки с использованием указанной кодирования:
Кода -копия выглядит следующим образом:
var str = buffer.toString ("utf-8"); // привет
Преобразует строку в двоичные данные в соответствии с указанной кодировкой:
Кода -копия выглядит следующим образом:
var buffer = new Buffer ("Hello", "UTF-8"); // <буфер 68 65 6c 6c 6f>
Небольшая разница:
Существует важная разница между буфером и строкой. Строка только для чтения, и любая модификация строки приводит к новой строке, а исходная строка остается неизменной.
Что касается буфера, то это больше похоже на массив C-языка, который может выполнять операции с указателями. Например, байты в определенной позиции могут быть непосредственно изменены в методе [индекс].
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Метод срезов не возвращает новый буфер, а скорее возвращает указатель в местоположение в середине исходного буфера, как показано ниже.
[0x68, 0x65, 0x6c, 0x6c, 0x6f]
^ ^
| |
bin bin.slice (2)
Следовательно, модификация буфера, возвращаемого методом срезов, будет действовать в исходном буфере, например:
Кода -копия выглядит следующим образом:
var buffer = новый буфер ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var sub = bin.slice (2);
sub [0] = 0x65;
console.log (буфер); // <буфер 68 65 65 6c 6f>
Если вы хотите скопировать буфер, вы должны сначала создать новый буфер и скопировать данные в исходном буфере с помощью метода .copy.
Это похоже на применение к новой части памяти и копирование данных в существующей памяти. Вот пример.
Кода -копия выглядит следующим образом:
var buffer = новый буфер ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var dup = новый буфер (bin.length);
buffer.copy (dup);
dup [0] = 0x48;
console.log (буфер); // <буфер 68 65 6c 6c 6f>
console.log (dup); // <буфер 48 65 65 6c 6f>
Короче говоря, Buffer расширяет возможности обработки данных JS от строк до произвольных двоичных данных.
Вышеуказанное кратко позволяет вам понять, что такое буфер. Давайте поговорим о том, как его использовать, и о конкретных сценариях использования ниже.
Во -вторых, поговорить о буфере
JavaScript очень дружелюбен к обработке строк, и, является ли он широкой байтовой или одиночной строкой, он считается строкой. Узел должен обрабатывать сетевые протоколы, эксплуатация баз данных, обработки изображений, загрузки файлов и т. Д., А также необходимо обработать большое количество двоичных данных. Строки, которые идут с ними, далеки от удовлетворения этих требований, поэтому буфер возникла.
Буферная структура
Буфер - это типичный модуль, который объединяет JavaScript и C ++. Часть, связанная с производительностью, реализована в C ++, а в JavaScript в JavaScript деталь, связанная с неэффективностью.
Узел устанавливается в память, когда процесс запускается и помещает его в глобальный объект, поэтому его не нужно.
Буферный объект: аналогично массиву, его элементы являются двузначными в шестнадцатеричной.
Распределение буферной памяти
Распределение памяти буферного объекта не находится в памяти кучи V8, но оно реализует приложение памяти на уровне C ++ узла.
Чтобы эффективно использовать приложение памяти, Node использует механизм распределения плиты, который представляет собой механизм динамического управления памятью, который применяет различные *NIX Opering Systems. Есть три состояния плиты:
(1) Полный: полностью выделенное состояние
(2) Частичное: статус частичного распределения
(3) пусто: не назначенное состояние
Преобразование буфера
Буферные объекты могут быть преобразованы в строки, а поддерживаемые типы кодировки следующие:
ASCII, UTF-8, UTF-16LE/UCS-2, BASE64, Binary, Hex
Строка в буфер
Новый буфер (str, [кодирование]), по умолчанию UTF-8
buf.write (String, [offset], [длина], [кодирование])
Буфер по строке
buf.tostring ([кодирование], [Start], [end])
Типы кодирования, которые не поддерживаются буфером
Определите, поддерживает ли он это с помощью Buffer.isencoding (кодирование)
ICONV-LITE: Чистое JavaScript реализация, более легкая, лучшая производительность без C ++ в преобразование JavaScript
ICONV: вызов библиотеки Libiconv в C ++ завершает
Буферный сплайсинг
Примечание "res.on ('data', function (chunk) {})", где кусок параметров является буферным объектом. Непосредственно с использованием + строчки будет автоматически преобразовано в строку. Для широких байтовых символов может возникнуть искаженный код.
Решение:
(1) С помощью метода setencoding () в читаемом потоке этот метод позволяет событию данных передавать буферный объект, но кодируемая строка, а модуль строккодера используется внутри.
(2) Хранение буферного объекта в массив и, наконец, собирать его в большой буфер, а затем кодировать его в строковый выход.
Буфер широко используется в вводе/выводе файлов и сетевом вводе/выводе, и его производительность имеет большое значение и намного выше, чем у обычных строк.
В дополнение к потере производительности преобразования струн при использовании буфера настройка Highwatermark имеет решающее значение для воздействия на производительность при чтении файла.
а Настройки Highwatermark оказывают определенное влияние на распределение и использование буферной памяти.
беременный Настройка Highwatermark слишком мала, что может привести к слишком большому количеству системных вызовов.
Когда я должен использовать буфер, когда я не использую его ------- Pure Javascript поддерживает код Unicode, но не поддерживает двоичный файл. При решении потоков TCP или файловых потоков необходимо обрабатывать потоки. Когда мы сохраняем строки без UTF-8, бинарные и другие форматы, мы должны использовать «буфер».
3. Представьте примеры
Кода -копия выглядит следующим образом:
var buf = new Buffer («Это текстовый тест Concat!»), STR = "Это тест на текстовый контакт!" ;
Console.Time («Тест на буферный конт!»);
var list = [];
var len = 100000 * buf.length;
для (var i = 0; i <100000; i ++) {
list.push (buf);
len += buf.length;
}
var s1 = buffer.concat (list, len) .toString ();
Console.TimeEnd («Тест на буферное соединение!»);
console.time ("test String Concat!");
var list = [];
для (var i = 100000; i> = 0; i--) {
list.push (str);
}
var s2 = list.join ("" ");
Console.TimeEnd ("Test String Concat!");
Ниже приведены результаты работы:
Скорость чтения определенно быстрее, и буфер также требует работы ToString (). Поэтому, когда мы сохраняем струны, нам все еще нужно использовать строку. Даже если мы разбиваем струны в больших струнах, скорость струн не будет медленнее, чем буферы.
Итак, когда нам нужно снова использовать буферы? Когда мы не можем сохранять строки без utf-8, бинарные и другие форматы, мы должны их использовать.
Четыре, давайте обобфрим
(1) JavaScript подходит для обработки кодируемых данных Unicode, но не дружит с обработкой бинарных данных.
(2), Таким образом, при обработке потоков TCP или файловых систем необходимо обрабатывать октет -потоки.
(3) Узел имеет несколько методов для обработки, создания и потребления октет -потоков.
(4) Необработанные данные хранятся в экземпляре буфера. Буфер аналогичен целочисленному массиву, но его память выделяется за пределами стека V8. Размер буфера не может быть изменен.
(5), обработанные типы кодировки: ASCII, UTF8, UTF16LE, UCS2 (псевдоним для UTF16LE), BASE64, BINARY, HEX.
(6) Буфер является глобальным элементом, а экземпляр буфера получается непосредственно новым буфером ().