Node.js缓冲区和类型化数组的比较

23

哪个更高效 - nodejs缓冲区或类型化数组?我应该使用哪个来获得更好的性能? 我认为只有了解V8和NodeJs内部的人才能回答这个问题。

3个回答

7
一个 Node.js 的缓冲区(buffer)应该比一个类型数组(typed array)更高效。原因很简单,因为当创建一个新的 Node.js 缓冲区时,它不需要初始化为全部为 0。相反,HTML5 规范规定,必须将类型数组的初始化值设置为 0。分配内存并将所有内存设置为 0 需要更多时间。
在大多数应用程序中,选择其中一个都不会有太大影响。如常所言,魔鬼在于基准测试 :) 然而,我建议你选择一个并坚持使用它。如果你经常在两者之间进行转换,性能会受到影响。
这里有一个不错的讨论:https://github.com/joyent/node/issues/4884

2
看起来出于安全原因,Node 8 已经弃用了这个“特性”。 - styfle

5
有几件事情值得一提:
  1. Buffer 实例是 Uint8Array 实例,但与 ECMAScript 2015 中的 TypedArray 规范存在微妙的不兼容性。例如,虽然 ArrayBuffer#slice() 创建一个切片的副本,但 Buffer#slice() 的实现创建了一个视图,而不是拷贝,使得 Buffer#slice() 更加高效。
  2. 使用 Buffer.allocUnsafe()Buffer.allocUnsafeSlow() 时,内存并没有被清零(正如许多人已经指出的那样)。因此,请确保您完全覆盖了分配的内存,否则在读取 Buffer 内存时,旧数据可能会泄漏。
  3. TypedArrays 不可立即读取,您需要使用 DataView。这意味着如果您要迁回到 Buffer,可能需要重新编写代码。在这里,适配器模式 可能会有所帮助。
  4. 您可以在 Buffer 上使用 for-of。但是,您不能在 TypedArrays 上使用它。此外,您不会有经典的 entries()values()keys()length 支持。
  5. Buffer 在前端中没有得到支持,而 TypedArray 可能会得到支持。因此,如果您的代码在前端或后端之间共享,您可能需要考虑坚持使用一种类型。

更多信息请查看这里的文档


1

这是一个棘手的问题,但我认为它将取决于您计划如何使用它们以及您计划处理多少数据?

类型化数组本身需要节点缓冲区,但更容易操作,并且您可以克服1GB限制(kMaxLength = 0x3fffffff)。

如果您正在执行常见操作,例如迭代、设置、获取、切片等,则类型化数组应该是性能最佳的选择,而不是内存(特别是如果您正在处理浮点和64位整数类型)。

最终,可能只有对您想要做的内容进行良好基准测试才能真正解决这个疑问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接