2012-04-03 2 views
19

Quoi de plus efficace - buffers nodejs ou tableaux typés? Que dois-je utiliser pour de meilleures performances? Je pense que seuls ceux qui connaissent les intérieurs de V8 et NodeJs pourraient répondre à cette question.nodejs buffers vs tableaux typés

Répondre

1

Ceci est difficile, mais je pense que cela dépendra de ce que vous envisagez de faire avec eux et de la quantité de données que vous envisagez de travailler avec?

Les baies tapées elles-mêmes ont besoin de tampons de noeud, mais elles sont plus faciles à utiliser et vous pouvez surmonter la limite de 1 Go (kMaxLength = 0x3fffffff). Si vous faites des choses courantes telles que les itérations, la définition, l'obtention, le découpage, etc ... alors les tableaux typés devraient être votre meilleur coup pour la performance, pas la mémoire (spécialement si vous avez des types entiers flottants et 64bits) . En fin de compte, probablement seulement un bon benchmark avec ce que vous voulez faire peut faire la lumière sur ce doute.

8

Un Node.js buffer devrait être plus efficace qu'un tableau typé. La raison en est simplement que lorsqu'un nouveau tampon Node.js est créé, il n'a pas besoin d'être initialisé à tous les 0. Alors que la spécification HTML5 stipule que l'initialisation des tableaux typés doit avoir leurs valeurs définies à 0. Allouer la mémoire, puis mettre toute la mémoire à 0 prend plus de temps.

Dans la plupart des applications, choisir l'une ou l'autre n'aura aucune importance. Comme toujours, le diable se situe dans les repères :) Cependant, je vous recommande de choisir un et respectez-le. Si vous effectuez souvent des conversions entre les deux, vous subirez un coup de performance.

belle discussion ici: https://github.com/joyent/node/issues/4884

+0

Il semble que [Nœud 8] (https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html # buffer_new_buffer_size) a désapprouvé cette "fonctionnalité" pour des raisons de sécurité. – styfle

2

Il y a quelques petites choses que je pense méritent d'être mentionnés:

  1. Buffer instances sont Uint8Array cas, mais il y a des incompatibilités subtiles avec la spécification TypedArray à ECMAScript 2015. Pour Par exemple, alors que ArrayBuffer#slice() crée une copie de la tranche, l'implémentation de Buffer#slice() crée une vue sur le tampon existant sans copie, ce qui rend Buffer#slice() beaucoup plus efficace.
  2. Lorsque vous utilisez Buffer.allocUnsafe() et Buffer.allocUnsafeSlow() la mémoire n'est pas remise à zéro (comme beaucoup l'ont déjà souligné). Assurez-vous donc d'écraser complètement la mémoire allouée ou vous pouvez autoriser la fuite des anciennes données lors de la lecture de la mémoire tampon.
  3. TypedArrays ne sont pas lisibles tout de suite, vous aurez besoin d'un DataView pour cela. Ce qui signifie que vous devrez peut-être réécrire votre code si vous revenez à Buffer. Adapter pattern pourrait aider ici.
  4. Vous pouvez utiliser for-of sur Buffer. Vous ne pouvez pas sur TypedArrays. En outre, vous n'aurez pas le support classique entries(), values(), keys() et length.
  5. Buffer n'est pas supporté dans le frontend alors que TypedArray pourrait bien l'être. Donc, si votre code est partagé entre frontend ou backend vous pourriez envisager de s'en tenir à un.

More info in the docs here.