什么更有效 - nodejs缓冲区或类型化数组?我应该使用什么来获得更好的性能? 我认为只有那些了解V8和NodeJ内饰的人才能回答这个问题。
答案 0 :(得分:7)
Node.js buffer
应该比键入的数组更有效。原因很简单,因为当创建一个新的Node.js Buffer时,不需要将其初始化为全0。然而,HTML5规范声明类型化数组的初始化必须将其值设置为0.分配内存然后将所有内存设置为0需要更多时间。
在大多数应用程序中,选择任何一个都无关紧要。和往常一样,魔鬼在于基准测试:)但是,我建议你选择一个并坚持下去。如果你经常在两者之间来回转换,那么你将会受到影响。
答案 1 :(得分:3)
我认为有一些事情值得一提:
Buffer
个实例是Uint8Array个实例,但与ECMAScript 2015中的TypedArray规范存在微妙的不兼容性。例如,当ArrayBuffer#slice()
创建切片的副本时,Buffer#slice()
的实现1}}在不复制的情况下创建现有缓冲区的视图,使Buffer#slice()
更有效率。Buffer.allocUnsafe()
和Buffer.allocUnsafeSlow()
时,内存不会被清零(正如许多人已经指出的那样)。因此,请确保完全覆盖已分配的内存,或者在读取缓冲区内存时允许旧数据泄露。TypedArrays
无法立即阅读,您需要DataView
。这意味着如果要迁移回Buffer
,可能需要重写代码。 Adapter pattern可以在这里提供帮助。 Buffer
上使用for-of。你不能TypedArrays
。此外,您还没有获得经典的entries()
,values()
,keys()
和length
支持。Buffer
TypedArray
。因此,如果您的代码在前端或后端之间共享,您可能会考虑坚持使用。答案 2 :(得分:1)
这是一个艰难的问题,但我认为这将取决于您打算如何处理它们以及您计划使用多少数据?
类型化数组本身需要节点缓冲区,但更容易使用,您可以克服1GB限制(kMaxLength = 0x3fffffff)。
如果你正在做常见的事情,比如迭代,设置,获取,切片等等......那么输入数组应该是性能的最佳镜头,而不是内存(特别是如果你正在处理float和64bits整数类型)。
最后,可能只有你想要做的好基准可以揭示这个疑问。