2012-04-03 92 views

回答

1

這是一個艱難的過程,但我認爲這將取決於您打算如何處理它們以及計劃使用多少數據?

鍵入數組本身需要節點緩衝區,但更容易使用,並且可以克服1GB限制(kMaxLength = 0x3fffffff)。

如果你在做一些常見的事情,比如迭代,設置,獲取,切片等......那麼類型化數組應該是性能最好的鏡頭,而不是內存(特別是如果你正在處理float和64位整數類型) 。最後,大概只有一個很好的基準與你想做的事情可以揭示這個疑問。

8

Node.js buffer應該比類型化數組更有效。原因很簡單,因爲當創建一個新的Node.js緩衝區時,它不需要初始化爲全0。而HTML5規範指出,類型化數組的初始化必須將其值設置爲0.分配內存然後將所有內存設置爲0需要更多時間。

在大多數應用程序中,選擇其中一個並不重要。一如既往,魔鬼在於基準:)但是,我建議你選一個並堅持下去。如果你經常在兩者之間來回轉換,那麼你會受到性能影響。

尼斯這裏的討論:https://github.com/joyent/node/issues/4884

+0

看起來像[Node 8](https://nodejs.org/dist/latest-v8.x/docs/api/buffer。html#buffer_new_buffer_size)出於安全原因已棄用此「功能」。 – styfle 2017-07-30 20:32:26

2

有,我認爲是值得一提的幾件事情:

  1. Buffer實例是Uint8Array實例,但也有在2015年的ECMAScript的TypedArray規範微妙的不兼容性例如,雖然ArrayBuffer#slice()創建了分片的副本,但Buffer#slice()的實現創建了現有緩衝區的視圖而沒有進行復制,使得Buffer#slice()更加高效。
  2. 當使用Buffer.allocUnsafe()Buffer.allocUnsafeSlow()時,存儲器未被清零(正如許多人已經指出的那樣)。因此,確保您完全覆蓋已分配的內存,或者在讀取緩衝區內存時允許舊數據泄漏。
  3. TypedArrays不能立即讀取,您需要一個DataView。這意味着如果您要遷移回Buffer,則可能需要重寫代碼。 Adapter pattern可以在這裏幫助。
  4. 您可以在Buffer上使用for-of。你不能在TypedArrays。你也不會有經典的entries()values(),keys()length支持。
  5. Buffer在前端不支持,而TypedArray很可能。所以如果你的代碼是在前端或後端之間共享的,你可能會考慮堅持一個。

More info in the docs here