nodejs缓冲区与类型化数组

And*_*Kon 21 node.js

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

JP *_*son 7

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

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

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

  • 出于安全原因,似乎 [Node 8](https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html#buffer_new_buffer_size) 已弃用此“功能”。 (2认同)

Fra*_*ula 5

我认为有几点值得一提:

  1. Buffer实例是Uint8Array实例,但与 ECMAScript 2015 中的 TypedArray 规范存在细微的不兼容。例如,在ArrayBuffer#slice()创建切片的副本时,实现Buffer#slice()在现有 Buffer上创建视图而不进行复制,从而Buffer#slice()提高了效率。
  2. 使用时Buffer.allocUnsafe()Buffer.allocUnsafeSlow()内存未清零(正如许多人已经指出的那样)。因此,请确保完全覆盖分配的内存,否则您可以在读取缓冲区内存时允许旧数据泄漏。
  3. TypedArrays不是立即可读的,你需要一个DataView。这意味着如果您要迁移回Buffer. 适配器模式可以在这里提供帮助。
  4. 您可以使用换的Buffer。你不能上TypedArrays。你也不会有经典的entries()values()keys()length支持。
  5. Buffer前端不支持,但很TypedArray可能支持。因此,如果您的代码在前端或后端之间共享,您可能会考虑坚持使用一个。

此处文档中的更多信息


小智 1

这是一项艰巨的任务,但我认为这取决于您计划如何处理它们以及您计划使用多少数据?

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

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

最后,可能只有对你想做的事情有一个好的基准才能真正澄清这个疑问。