nodejs缓冲区与类型化数组

时间:2012-04-03 06:28:08

标签: node.js

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

3 个答案:

答案 0 :(得分:7)

Node.js buffer应该比键入的数组更有效。原因很简单,因为当创建一个新的Node.js Buffer时,不需要将其初始化为全0。然而,HTML5规范声明类型化数组的初始化必须将其值设置为0.分配内存然后将所有内存设置为0需要更多时间。

在大多数应用程序中,选择任何一个都无关紧要。和往常一样,魔鬼在于基准测试:)但是,我建议你选择一个并坚持下去。如果你经常在两者之间来回转换,那么你将会受到影响。

在这里讨论很好:https://github.com/joyent/node/issues/4884

答案 1 :(得分:3)

我认为有一些事情值得一提:

  1. Buffer个实例是Uint8Array个实例,但与ECMAScript 2015中的TypedArray规范存在微妙的不兼容性。例如,当ArrayBuffer#slice()创建切片的副本时,Buffer#slice()的实现1}}在不复制的情况下创建现有缓冲区的视图,使Buffer#slice()更有效率。
  2. 使用Buffer.allocUnsafe()Buffer.allocUnsafeSlow()时,内存不会被清零(正如许多人已经指出的那样)。因此,请确保完全覆盖已分配的内存,或者在读取缓冲区内存时允许旧数据泄露。
  3. TypedArrays无法立即阅读,您需要DataView。这意味着如果要迁移回Buffer,可能需要重写代码。 Adapter pattern可以在这里提供帮助。
  4. 您可以在Buffer上使用for-of。你不能TypedArrays。此外,您还没有获得经典的entries()values()keys()length支持。
  5. 前端不支持
  6. Buffer TypedArray。因此,如果您的代码在前端或后端之间共享,您可能会考虑坚持使用。
  7. More info in the docs here

答案 2 :(得分:1)

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

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

如果你正在做常见的事情,比如迭代,设置,获取,切片等等......那么输入数组应该是性能的最佳镜头,而不是内存(特别是如果你正在处理float和64bits整数类型)。

最后,可能只有你想要做的好基准可以揭示这个疑问。