哪个更高效 - nodejs缓冲区或类型化数组?我应该使用哪个来获得更好的性能? 我认为只有了解V8和NodeJs内部的人才能回答这个问题。
哪个更高效 - nodejs缓冲区或类型化数组?我应该使用哪个来获得更好的性能? 我认为只有了解V8和NodeJs内部的人才能回答这个问题。
Buffer
实例是 Uint8Array 实例,但与 ECMAScript 2015 中的 TypedArray 规范存在微妙的不兼容性。例如,虽然 ArrayBuffer#slice()
创建一个切片的副本,但 Buffer#slice()
的实现创建了一个视图,而不是拷贝,使得 Buffer#slice()
更加高效。Buffer.allocUnsafe()
和 Buffer.allocUnsafeSlow()
时,内存并没有被清零(正如许多人已经指出的那样)。因此,请确保您完全覆盖了分配的内存,否则在读取 Buffer 内存时,旧数据可能会泄漏。TypedArrays
不可立即读取,您需要使用 DataView
。这意味着如果您要迁回到 Buffer
,可能需要重新编写代码。在这里,适配器模式 可能会有所帮助。Buffer
上使用 for-of
。但是,您不能在 TypedArrays
上使用它。此外,您不会有经典的 entries()
、values()
、keys()
和 length
支持。Buffer
在前端中没有得到支持,而 TypedArray
可能会得到支持。因此,如果您的代码在前端或后端之间共享,您可能需要考虑坚持使用一种类型。这是一个棘手的问题,但我认为它将取决于您计划如何使用它们以及您计划处理多少数据?
类型化数组本身需要节点缓冲区,但更容易操作,并且您可以克服1GB限制(kMaxLength = 0x3fffffff)。
如果您正在执行常见操作,例如迭代、设置、获取、切片等,则类型化数组应该是性能最佳的选择,而不是内存(特别是如果您正在处理浮点和64位整数类型)。
最终,可能只有对您想要做的内容进行良好基准测试才能真正解决这个疑问。