2012-04-03 18 views

Respuesta

1

Esto es difícil, pero creo que dependerá de lo que planeas hacer con ellos y de la cantidad de datos con los que planeas trabajar.

las matrices tipadas necesitan buffers de nodos, pero son más fáciles de usar y puede superar el límite de 1 GB (kMaxLength = 0x3fffffff).

Si está haciendo cosas comunes como iteraciones, configuración, obtención, división, etc. ... las matrices tipadas deben ser la mejor opción para el rendimiento, no la memoria (especialmente si se trata de tipos enteros de flotante y 64 bits) .

Al final, probablemente solo un buen punto de referencia con lo que quiere hacer puede arrojar mucha luz sobre esta duda.

8

Un Node.js buffer debería ser más eficiente que una matriz tipada. El motivo es simplemente porque cuando se crea un nuevo Node.js Buffer no es necesario inicializarlo a todos los 0. Mientras que, la especificación HTML5 establece que la inicialización de las matrices tipadas debe tener sus valores establecidos en 0. La asignación de la memoria y la configuración de toda la memoria en 0 lleva más tiempo.

En la mayoría de las aplicaciones, elegir uno no importará. Como siempre, el diablo se encuentra en los puntos de referencia :) Sin embargo, le recomiendo que elija uno y se quede con él. Si a menudo se convierte de ida y vuelta entre los dos, tendrá un golpe de rendimiento.

Niza discusión aquí: https://github.com/joyent/node/issues/4884

+0

Parece que [Nodo 8] (https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html # buffer_new_buffer_size) ha dejado de usar esta "característica" por razones de seguridad. – styfle

2

Hay algunas cosas que creo que vale la pena mencionar:

  1. Buffer casos son Uint8Array casos pero existen incompatibilidades sutiles con la especificación ECMAScript TypedArray en 2015. Por ejemplo, mientras que ArrayBuffer#slice() crea una copia del sector, la implementación de Buffer#slice() crea una vista del Buffer existente sin copiar, lo que hace que Buffer#slice() sea mucho más eficiente.
  2. Al utilizar Buffer.allocUnsafe() y Buffer.allocUnsafeSlow(), la memoria no se pone a cero (como muchos ya lo han señalado). Así que asegúrese de sobrescribir completamente la memoria asignada o puede permitir que se filtren los datos antiguos cuando se lee la memoria intermedia.
  3. TypedArrays no se pueden leer de inmediato, necesitará un DataView para eso. Lo que significa que es posible que necesite volver a escribir el código si tuviera que volver a migrar al Buffer. Adapter pattern podría ayudar aquí.
  4. Puede usar for-of en Buffer. No puede en TypedArrays. Además, no tendrá el soporte clásico entries(), values(), keys() y length.
  5. Buffer no es compatible en la interfaz mientras que TypedArray bien puede ser. Por lo tanto, si su código se comparte entre frontend o back-end, puede considerar quedarse con uno.

More info in the docs here.

Cuestiones relacionadas