nodejs缓冲区vstypes数组

什么更有效 – nodejs缓冲区或types数组? 我应该用什么来改善性能? 我认为只有知道V8和NodeJs内部的人才能回答这个问题。

Node.js buffer应该比types化数组更有效率。 原因很简单,因为当创build一个新的Node.js缓冲区时,不需要初始化为全0。 而HTML5规范指出,types化数组的初始化必须将其值设置为0.分配内存然后将所有内存设置为0需要更多时间。

在大多数应用中,select任何一个都不重要。 一如既往,魔鬼在于基准:)但是,我build议你选一个并坚持下去。 如果你经常在这两者之间来回转换,那么你将会受到性能的影响。

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

有几件事我觉得值得一提:

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

更多信息在这里的文档 。

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

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

如果你正在做的迭代,设置,获取,切片等常见的东西,那么types化数组应该是性能最好的select,而不是内存(尤其是如果你正在处理float和64位整数types的话)。

最后,可能只有一个很好的基准与你想做的事情可以揭示这个疑问。