1. Análisis de apertura
El llamado búfer del búfer significa "área de almacenamiento temporal", que es una memoria que almacena temporalmente los datos de entrada y salida.
El lenguaje JS en sí solo tiene tipos de datos de cadena y no hay tipos de datos binarios. Por lo tanto, NodeJs proporciona un búfer de constructor global que es pares para caducar para proporcionar operaciones en datos binarios. Además de leer archivos para obtener instancias de búfer, también se puede construir directamente, por ejemplo:
La copia del código es la siguiente:
var buffer = new buffer ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
El búfer es similar a una cadena. Además de usar el atributo .length para obtener la longitud de los bytes, también puede usar el método [índice] para leer los bytes en la posición especificada, por ejemplo:
La copia del código es la siguiente:
buffer [0]; // 0x68;
El búfer y la cadena se pueden convertir entre sí, por ejemplo, los datos binarios se pueden convertir en cadenas utilizando una codificación especificada:
La copia del código es la siguiente:
var str = buffer.ToString ("UTF-8"); // Hola
Convierte una cadena en datos binarios bajo la codificación especificada:
La copia del código es la siguiente:
var buffer = new Buffer ("Hola", "UTF-8"); // <búfer 68 65 6c 6c 6f>
Una pequeña diferencia:
Hay una diferencia importante entre un búfer y una cadena. La cadena es de solo lectura, y cualquier modificación de la cadena da como resultado una nueva cadena, y la cadena original permanece sin cambios.
En cuanto al búfer, es más como una matriz de lenguaje C que puede hacer operaciones de puntero. Por ejemplo, los bytes en una determinada posición pueden modificarse directamente en el método [índice].
---------------------------------------------------------------------------------------------------
El método Slice no devuelve un nuevo búfer, sino que devuelve un puntero a una ubicación en el medio del búfer original, como se muestra a continuación.
[0x68, 0x65, 0x6c, 0x6c, 0x6f]
^ ^ ^
| |
bin bin.lice (2)
Por lo tanto, la modificación del búfer devuelto por el método Slice actuará en el búfer original, por ejemplo:
La copia del código es la siguiente:
var buffer = new buffer ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var sub = bin.slice (2);
sub [0] = 0x65;
console.log (búfer); // <búfer 68 65 65 6c 6f>
Si desea copiar un búfer, primero debe crear un nuevo búfer y copiar los datos en el búfer original a través del método .copy.
Esto es similar a solicitar una nueva memoria y copiar los datos en la memoria existente. Aquí hay un ejemplo.
La copia del código es la siguiente:
var buffer = new buffer ([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var dup = new Buffer (bin.length);
buffer.copy (dup);
dup [0] = 0x48;
console.log (búfer); // <búfer 68 65 6c 6c 6f>
console.log (dup); // <búfer 48 65 65 6c 6f>
En resumen, Buffer extiende las capacidades de procesamiento de datos de JS desde cadenas hasta datos binarios arbitrarios.
Lo anterior le permite comprender qué es un amortiguador. Hablemos sobre cómo usarlo y los escenarios de uso específicos a continuación.
Segundo, habla de buffer
JavaScript es muy amigable con el procesamiento de cadenas, y si se trata de una cadena de byte o byte ancho, se considera una cadena. Node necesita procesar protocolos de red, bases de datos operativas, procesar imágenes, cargas de archivos, etc., y también debe procesar una gran cantidad de datos binarios. Las cuerdas que vienen con ellos están lejos de cumplir con estos requisitos, por lo que Buffer surgió.
Estructura de amortiguación
El búfer es un módulo típico que combina JavaScript y C ++. La parte relacionada con el rendimiento se implementa en C ++, y la parte no relacionada con el rendimiento se implementa en JavaScript.
El nodo se instala en la memoria cuando el proceso comienza y lo coloca en el objeto global, por lo que no es necesario requerirlo.
Objeto búfer: similar a una matriz, sus elementos son dos dígitos en hexadecimal.
Asignación de memoria de búfer
La asignación de memoria del objeto búfer no está en la memoria del montón de V8, pero implementa la aplicación de memoria en el nivel de nodo C ++.
Para usar eficientemente la aplicación de memoria, Node utiliza el mecanismo de asignación de losa, que es un mecanismo de gestión de memoria dinámica que aplica varios sistemas operativos *NIX. Hay tres estados de losa:
(1) Completo: estado completamente asignado
(2) Parcial: estado de asignación parcial
(3) Vacío: estado no asignado
Conversión de búfer
Los objetos de búfer se pueden convertir en cadenas, y los tipos de codificación compatibles son los siguientes:
ASCII, UTF-8, UTF-16LE/UCS-2, BASE64, Binario, Hex
Cadena para amortiguar
nuevo búfer (STR, [codificación]), UTF-8 predeterminado
buf.write (string, [offset], [longitud], [codificación])
Buffer a cadena
buf.toString ([codificación], [inicio], [final])
Tipos de codificación que no son compatibles con Buffer
Determine si lo admite por buffer.isEncoding (codificación)
ICONV-LITE: implementación pura de JavaScript, más ligero, mejor rendimiento sin C ++ a JavaScript Conversion
ICONV: Llamar a la biblioteca libiconv en C ++ completa
Empalme de amortiguación
Nota "Res.on ('Data', Function (Chunk) {})", donde la fragmentación del parámetro es un objeto búfer. Directamente usando + costuras se convertirá automáticamente en una cadena. Para los amplios caracteres de bytes, puede ocurrir un código confuso.
Solución:
(1) A través del método SetEncoding () en la secuencia legible, este método permite que el evento de datos pase un objeto de búfer, pero una cadena codificada, y el módulo StringEncoder se usa internamente.
(2) Almacenar el objeto de búfer en una matriz, y finalmente ensamblarlo en un búfer grande y luego codificarlo en una salida de cadena.
El búfer se usa ampliamente en la E/S de archivo y la E/S de red, y su rendimiento es de gran importancia y es mucho más alto que el de las cadenas ordinarias.
Además de la pérdida de rendimiento de la conversión de cadenas, cuando se usa un búfer, una configuración de HighwaterMark es crucial para el impacto del rendimiento al leer un archivo.
a. La configuración de HighwaterMark tiene un cierto impacto en la asignación y el uso de la memoria del búfer.
b. La configuración HighwaterMark es demasiado pequeña, lo que puede conducir a demasiadas llamadas al sistema.
¿Cuándo debo usar el búfer, cuándo no debo usarlo? Al resolver transmisiones TCP o transmisiones de archivos, es necesario procesar las secuencias. Cuando guardamos cadenas no UTF-8, formatos binarios y otros, debemos usar "búfer".
3. Introducir ejemplos
La copia del código es la siguiente:
var buf = new Buffer ("¡Esta es la prueba de concatación de texto!"), Str = "¡Esta es la prueba de concatación de texto!" ;
console.time ("¡Prueba de concat de buffer!");
var list = [];
var len = 100000 * buf.length;
para (var i = 0; i <100000; i ++) {
list.push (buf);
len += buf.length;
}
var s1 = buffer.concat (list, len) .ToString ();
console.timeend ("Prueba de concat de búfer!");
console.time ("¡prueba de concat de cadena!");
var list = [];
para (var i = 100000; i> = 0; i--) {
list.push (str);
}
var s2 = list.Join ("");
console.timeend ("¡prueba de concat de cadena!");
Los siguientes son los resultados de ejecución:
La velocidad de lectura es definitivamente más rápida, y el búfer también requiere la operación de toString (). Entonces, cuando guardamos cadenas, todavía necesitamos usar String. Incluso si empalmamos cadenas en grandes cuerdas, la velocidad de las cuerdas no será más lenta que los amortiguadores.
Entonces, ¿cuándo necesitamos volver a usar búferes? Cuando no hay forma, cuando ahorramos cadenas no UTF-8, formatos binarios y otros, debemos usarlas.
Cuatro, resumamos
(1) JavaScript es adecuado para procesar datos codificados por Unicode, pero no es amigable con el procesamiento de datos binarios.
(2), por lo que al procesar flujos de TCP o sistemas de archivos, es necesario procesar las secuencias de octetos.
(3), el nodo tiene varios métodos para procesar, crear y consumir flujos de octetos.
(4) Los datos sin procesar se almacenan en una instancia de búfer. Un búfer es similar a una matriz entera, pero su memoria se asigna fuera de la pila V8. El tamaño de un búfer no se puede cambiar.
(5), los tipos de codificación procesados son: ASCII, UTF8, UTF16LE, UCS2 (alias para UTF16LE), Base64, binario, hex.
(6) El búfer es un elemento global, y una instancia de búfer se obtiene directamente al nuevo búfer ().