nodejs缓冲区和类型化数组哪个更有效?我应该使用什么来获得更好的性能?我认为只有那些了解V8和NodeJs内部结构的人才能回答这个问题。
发布于 2013-10-11 02:51:51
Node.js数组应该比类型化数组更有效。原因很简单,因为当创建一个新的Node.js缓冲区时,它不需要被初始化为全0,而HTML5规范规定,类型化数组的初始化必须将它们的值设置为0。分配内存,然后将所有内存设置为0会花费更多时间。
在大多数应用程序中,选择哪一个都无关紧要。一如既往,魔鬼在于基准:)然而,我建议您选择一个并坚持使用它。如果你经常在两者之间来回转换,你的性能会受到影响。
发布于 2017-04-12 16:17:58
我认为有几件事值得一提:
Buffer
实例是Uint8Array实例,但与ECMAScript 2015中的TypedArray规范存在微妙的不兼容性。例如,虽然ArrayBuffer#slice()
创建了片的副本,但Buffer#slice()
的实现在现有缓冲区上创建了一个视图,而不是复制,这使得Buffer#slice()
使用Buffer.allocUnsafe()
和Buffer.allocUnsafeSlow()
时内存不会被清零(正如许多人已经指出的那样)。因此,请确保您完全覆盖分配的内存,或者您可以在缓冲区内存不可读时允许旧数据泄漏,您需要一个DataView
来实现这一点。这意味着如果要迁移回Buffer
,您可能需要重写代码。Adapter pattern可以在这方面提供帮助。Buffer
上使用for-of。你不能在TypedArrays
上。你也不会有经典的entries()
,values()
,keys()
和length
,前端不支持support.Buffer
,而TypedArray
可能会支持。因此,如果您的代码在前端或后端之间共享,您可能会考虑使用其中一个。发布于 2012-04-11 11:25:47
这是一个困难的问题,但我认为这将取决于您计划如何处理它们,以及您计划处理多少数据?
类型化数组本身需要节点缓冲区,但更容易使用,并且可以克服1 1GB的限制(kMaxLength = 0x3fffffff)。
如果你正在做一些常见的事情,比如迭代、设置、获取、切片等等。那么,类型化数组应该是性能的最佳选择,而不是内存(特别是在处理浮点数和64位整数类型时)。
最后,可能只有对您想要做的事情进行良好的基准测试才能真正阐明这一疑问。
https://stackoverflow.com/questions/9988166
复制相似问题