usar objetos llenar imprimir estructura enteros elementos ejemplos contar como arreglos arreglo array agregar javascript arraybuffer typed-arrays

objetos - llenar un arreglo en javascript



Anexando ArrayBuffers (3)

¿Cuál es la forma preferible de agregar / combinar ArrayBuffers?

Estoy recibiendo y analizando paquetes de red con una variedad de estructuras de datos. Los mensajes entrantes se leen en ArrayBuffers. Si llega un paquete parcial, necesito almacenarlo y esperar el siguiente mensaje antes de volver a intentar analizarlo.

Actualmente estoy haciendo algo como esto:

function appendBuffer( buffer1, buffer2 ) { var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength ); tmp.set( new Uint8Array( buffer1 ), 0 ); tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength ); return tmp.buffer; }

Obviamente, no puede evitar tener que crear un nuevo búfer, ya que los ArrayBuffers tienen una longitud fija, pero ¿es necesario inicializar matrices escritas? Al llegar, lo único que quiero es poder tratar los buffers como buffers; Los tipos y estructuras no son motivo de preocupación.


¿Por qué no usar un blob? (Me doy cuenta de que podría no haber estado disponible en ese momento).

Simplemente cree un Blob con sus datos, como var blob = new Blob([array1,array2,string,...]) y vuelva a convertirlo en un ArrayBuffer (si es necesario) usando un FileReader (vea this ).

Verifique esto: ¿Cuál es la diferencia entre BlobBuilder y el nuevo constructor de Blob? Y esto: MDN Blob API

EDITAR:

Quería comparar la eficiencia de estos dos métodos (Blobs y el método utilizado en la pregunta) y creé un JSPerf: http://jsperf.com/appending-arraybuffers

Parece que el uso de Blobs es más lento (de hecho, creo que es el uso de Filereader para leer el Blob que lleva más tiempo). Así que ya sabes;) Tal vez sería más eficiente cuando hay más de 2 ArrayBuffer (como reconstruir un archivo a partir de sus fragmentos).


Parece que ya has llegado a la conclusión de que no hay forma de crear un nuevo búfer de matriz. Sin embargo, por motivos de rendimiento, podría ser beneficioso añadir el contenido del búfer a un objeto de matriz estándar, luego crear un nuevo búfer de matriz o una matriz escrita a partir de eso.

var data = []; function receive_buffer(buffer) { var i, len = data.length; for(i = 0; i < buffer.length; i++) data[len + i] = buffer[i]; if( buffer_stream_done()) callback( new Uint8Array(data)); }

La mayoría de los motores de javascript ya tendrán espacio para la memoria asignada dinámicamente. Este método utilizará ese espacio en lugar de crear numerosas nuevas asignaciones de memoria, lo que puede ser un asesino de rendimiento dentro del núcleo del sistema operativo. Además de eso, también podrás eliminar algunas llamadas de función.

Una segunda opción más complicada sería asignar la memoria de antemano. Si conoce el tamaño máximo de cualquier flujo de datos, puede crear un búfer de matriz de ese tamaño, llenarlo (parcialmente si es necesario) y luego vaciarlo cuando termine.

Finalmente, si el objetivo principal es el rendimiento, y usted conoce el tamaño máximo de paquete (en lugar de todo el flujo), comience con un puñado de búferes de matriz de ese tamaño. A medida que llena su memoria asignada previamente, cree nuevos buffers entre las llamadas de la red, de forma asíncrona si es posible.