2012-04-03 4 views
19

Was ist effizienter - nodejs Puffer oder typisierte Arrays? Was sollte ich für bessere Leistung verwenden? Ich denke, dass nur diejenigen, die Innenräume von V8 und NodeJs kennen, diese Frage beantworten können.nodejs buffers vs typisierte Arrays

Antwort

1

Das ist eine schwierige Frage, aber ich denke, dass es davon abhängen wird, was Sie mit ihnen machen wollen und mit wie vielen Daten Sie arbeiten möchten?

typisierte Arrays selbst benötigen Knotenpuffer, sind aber einfacher zu spielen und Sie können die 1 GB Grenze überwinden (kMaxLength = 0x3fffffff).

Wenn Sie allgemeine Dinge wie Iterationen, Einstellungen, Getting, Slicing usw. tun, dann sollten typisierte Arrays die beste Leistung sein, nicht Speicher (besonders wenn Sie mit Float- und 64bit-Integer-Typen arbeiten). .

Am Ende, wahrscheinlich nur ein guter Maßstab mit dem, was Sie tun möchten, kann diese Zweifel richtig beleuchten.

8

Ein Node.js buffer sollte effizienter als ein typisiertes Array sein. Der Grund liegt einfach darin, dass wenn ein neuer Node.js-Puffer erstellt wird, er nicht für alle Nullen initialisiert werden muss. Die HTML5-Spezifikation besagt jedoch, dass bei der Initialisierung typisierter Arrays die Werte auf 0 gesetzt werden müssen. Das Zuweisen des Speichers und das anschließende Festlegen des gesamten Speichers auf Nullen benötigt mehr Zeit.

In den meisten Anwendungen spielt die Auswahl entweder keine Rolle. Wie immer liegt der Teufel in den Benchmarks :) Allerdings empfehle ich, dass Sie einen auswählen und dabei bleiben. Wenn Sie häufig zwischen den beiden hin- und herwechseln, erzielen Sie einen Leistungseinbruch.

Nizza Diskussion hier: https://github.com/joyent/node/issues/4884

+0

Es sieht so aus [Node 8] (https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html # buffer_new_buffer_size) hat dieses "Feature" aus Sicherheitsgründen veraltet. – styfle

2

Es gibt ein paar Dinge, die ich denke, sind erwähnenswert:

  1. Buffer Instanzen sind Uint8Array Instanzen, aber es gibt subtile Inkompatibilitäten mit der TypedArray Spezifikation in ECMAScript 2015. Für Beispiel: Während eine Kopie des Slice erstellt, erstellt die Implementierung Buffer#slice() eine Ansicht über den vorhandenen Puffer ohne zu kopieren, wodurch Buffer#slice() viel effizienter.
  2. Bei der Verwendung von Buffer.allocUnsafe() und Buffer.allocUnsafeSlow() wird der Speicher nicht auf Null gesetzt (wie viele bereits festgestellt haben). Stellen Sie also sicher, dass Sie den zugewiesenen Speicher vollständig überschreiben oder dass die alten Daten beim Lesen des Pufferspeichers durchgelassen werden.
  3. TypedArrays sind nicht sofort lesbar, Sie benötigen eine DataView dafür. Dies bedeutet, dass Sie möglicherweise Ihren Code neu schreiben müssen, wenn Sie zurück zu Buffer migrieren. Adapter pattern könnte hier helfen.
  4. Sie können for-of unter Buffer verwenden. Sie können nicht auf TypedArrays. Sie werden auch nicht die klassischen entries(), values(), keys() und length Unterstützung haben.
  5. Buffer wird nicht im Frontend unterstützt, während TypedArray gut sein kann. Wenn Sie also Ihren Code zwischen Frontend oder Backend freigeben, können Sie sich an einen Code halten.

More info in the docs here.