vectores objetos imprimir example estructura ejemplos como arreglo array agregar javascript arraybuffer

objetos - ¿Dónde utilizar ArrayBuffer vs matriz escrita en JavaScript?



javascript arraybuffer to string (1)

Conceptos

ArrayBuffer s representa una matriz de bytes en la memoria física. Un ArrayBuffer es el almacenamiento real de los bytes, pero rara vez se utiliza directamente; de ​​hecho, no tiene acceso para leer el contenido de ArrayBuffer directamente y solo puede pasar una referencia para él. Por otro lado, se utilizan para transferencias de datos binarios entre el servidor y el cliente, o desde el sistema de archivos del usuario a través de Blobs.


ArrayBuffer byte array en la memoria: cada índice es igual a un byte. ArrayBuffer está alineado en la memoria.

Para leer el contenido de un ArrayBuffer necesita usar una vista . Esto se encuentra en la parte superior y ofrece una "api" para acceder a los bytes por diferentes tipos de ancho, o arbitrariamente.

Vistas dependientes del ancho

Las diferentes vistas se utilizan dependiendo de lo que necesites. Si solo necesitas leer valores de byte, es decir. valores con signo entre -128 y 127 -o- valores sin signo entre 0-255, usarías Int8Array o Uint8Array. Tenga en cuenta que sus nombres son un poco "confusos", ya que son vistas y no matrices, y solo hacen referencia al ArrayBuffer subyacente.

Del mismo modo, tienes vistas para Int8Array , Uint8Array , Uint8ClampedArray , Int16Array , Uint16Array , Int32Array , Uint3Array , Float32Array y Float64Array .

Con la excepción de * int8Arrays, los otros vienen con algún requisito para el tamaño de ArrayBuffer. Por ejemplo, una vista de Uint32Array debe estar encima de un ArrayBuffer que es divisible por cuatro, de lo contrario arroja un error. * int 16 vistas requerirían un límite de dos bytes.

Por lo general, esto no es un problema porque puede especificar el número de índices usando el constructor de la vista directamente y se creará automáticamente un ArrayBuffer correspondiente para que cumpla con estos requisitos.

Y dado que ArrayBuffer es una matriz de bytes, una vista * int16 lee dos bytes, o un índice = dos bytes, * int32 cuatro, o un índice = cuatro bytes, y así sucesivamente.

La principal diferencia entre Uint8Array y Uint8ClampedArray es que los valores fuera del rango están sujetos a módulo (por ejemplo, 256 se convierte en 0) con las matrices ordinarias. En la matriz restringida, los valores son los sugeridos en su lugar (256 se convierte en 255).


Vistas de Int16 / Uint16: cada índice representa dos bytes y está alineado con la memoria.


Vistas de Int32 / Uint32 y Float32: cada índice representa cuatro bytes y está alineado con la memoria.


Vista Float64: cada índice representa ocho bytes y está alineado con la memoria.

DataView para flexibilidad

Luego está el DataView. Esto es para escenarios en los que necesita un ArrayBuffer flexible y necesita leer anchos variables y desde posiciones en el búfer que no están necesariamente alineadas con el ancho o la memoria.

Por ejemplo, un índice * int32 siempre apuntará a una ubicación de memoria que se puede dividir en cuatro. Por otro lado, un DataView puede leer un Uint32 desde, por ejemplo, la posición 5 y se encargará de todos los pasos necesarios internamente (cambio de bits, enmascaramiento, etc.), pero a costa de una pequeña sobrecarga.

Otra diferencia es que un DataView no usa índices sino posiciones de byte absolutas para los datos que representa, y viene con sus propios métodos para leer o escribir varios anchos desde / hacia cualquier posición.


DataView - puede leer desde cualquier posición y cualquier ancho.

En otros casos, puede usar varias vistas diferentes que hacen referencia al mismo ArrayBuffer subyacente.

Actualmente no hay vistas de 64 bits para números enteros, pero parece que se proponen para ES8 .

SharedArrayBuffers

También es útil mencionar los nuevos SharedArrayBuffers que se pueden usar en los trabajadores web.

Puede (y aún puede) usar objetos transferibles en el pasado en algunos navegadores, pero SharedArrayBuffers es más eficiente en el sentido de que la memoria permanece igual, solo se transfiere información sobre ella. SharedArrayBuffers no puede separarse como ArrayBuffers puede.

Áreas de propósito y uso

Las matrices escritas son buenas para almacenar valores numéricos específicos y son rápidas. Los mapas de bits son un candidato típico para matrices tipeadas (por ejemplo, canvas 2D / WebGL).

El procesamiento de datos pesados ​​de datos dentro de los trabajadores web es otro uso y así sucesivamente. Ya mencioné la transferencia binaria entre cliente y servidor o el sistema de archivos.

Los DataViews son perfectos para analizar o crear archivos binarios y formatos de archivos.

Los arreglos escritos son una excelente manera de empaquetar datos binarios para enviarlos a través de la red, al servidor o a través de sockets web y cosas como canales de datos para WebRTC.

Si se ocupa de la grabación de audio, video, lienzo o medios, a menudo no hay manera de evitar el uso de matrices con tipo.

Las claves para usar arreglos escritos son el rendimiento y la memoria. Se usan con mayor frecuencia en escenarios especiales, pero no hay nada de malo en usarlos en casos normales cuando solo necesita almacenar valores numéricos (o cadenas de caracteres utf-8, vectores de cifrado, etc.) Son rápidos y tienen una huella de memoria baja.

Precauciones

Hay un par de precauciones a tener en cuenta:

Orden de bytes

Se deben tomar algunas precauciones con respecto al orden de bytes. Las matrices escritas siempre reflejan la arquitectura de la CPU con la que se ejecutan, es decir. little-endian o big-endian La mayoría de los sistemas de consumo son little-endian, pero cuando se usan los arreglos * int16 y * int32, se debe prestar especial atención al orden de bytes. DataView también puede ayudar con esta parte, pero no siempre es una buena opción si el rendimiento es importante.

El orden de bytes también es importante cuando se reciben datos del servidor. Por lo general, siempre están en formato big-endian (también conocido como "orden de red"). Para los formatos de archivos de análisis se aplicará lo mismo.

Codificación del número de punto flotante

Float32 / Float64 leerá y escribirá números codificados en el IEEE-754 . Esto también es algo que se debe tener en cuenta si se usan varias vistas para el mismo búfer.

Soporte de navegador cruzado

La mayoría de los navegadores son compatibles con matrices tipadas en la actualidad. Si tiene que lidiar con navegadores más antiguos, debe volver a IE9 o navegadores móviles más antiguos para no poder usarlos.

Safari no está particularmente optimizado en cuanto a su rendimiento, pero los otros beneficios están ahí. La versión 5.1 no es compatible con Float64.

Los dispositivos móviles tienen sus propias limitaciones de hardware, pero en general: los arreglos escritos son seguros de usar. Para casos especiales existe un polyfill .

Me estoy moviendo de Node.js al entorno del navegador, y todavía estoy confundido con ArrayBuffer vs. arrays escritos (como Uint8Array).

Estoy confundido sobre dónde usar los arreglos escritos y dónde usar ArrayBuffer directamente. No es difícil convertir uno a otro y viceversa, pero ¿cuál usar cuándo?

Por ejemplo, cuando estoy creando un objeto que representará una porción de datos en mi código, ¿debería ser ArrayBuffer o Uint8Array? ¿De qué depende?

O bien: ¿debería devolver ArrayBuffer desde mis funciones (por ejemplo, para API externa) o los arrays escritos?

Tenga en cuenta que puedo buscar en Google exactamente cómo agregar elementos, etc., a esas matrices escritas; Lo que me falta es una breve guía general sobre qué usar, dónde. Especialmente cuando se mueve desde Buffer de nodo.