Node.js中的缓冲区是什么?

42
正如你在Node.js缓冲区类文档中所读到的,缓冲区类似于整数数组,但对应于V8堆之外的原始内存分配。

那么迄今为止,一切都还好。

现在令我困惑的问题是什么是缓冲区从技术上讲。 它是否只是数组,具有一些额外的函数用于使用特定编码创建和转换为字符串?

还是说这里面还有“更多”的东西?


1
NodeJS中缓冲区的深入探讨 - Nino Filiu
3个回答

35

缓冲区是一块内存,就像在C/C++中一样。您可以将此内存解释为各种长度的整数或浮点数数组,或作为二进制字符串。与高级数据结构(如数组)不同的是,缓冲区大小不可调整。

它大致对应:

  • C/C++中的char*char[]
  • Java中的byte[]
  • Python中的可变的bytes 或不可调整的bytearray
  • 如果PHP中的字符串是可变的,则相当于字符串。

1
好的,与C语言中的char[]或char*进行比较对我来说很有意义。感谢您澄清这一点!这个类比帮助我理解缓冲区的含义:-)。 - Golo Roden
1
@phihag,您能否举个例子,说明我们应该在哪些情况下使用缓冲区而不是普通的数据类型,比如数组本身。 - Sachin Bhandari
1
@SachinBhandari 假设你想读取一个1GB的二进制文件。你可以将它表示为整数数组或缓冲区(Buffer)。使用缓冲区,你需要大约1GB的存储空间(+32字节的开销)。从缓冲区获取元素将会进行一次边界检查和一次内存访问。 - phihag
1
如果您使用介于0和255之间的整数数组,则内存需求将为1G 指针大小。在64位系统上,这相当于8GB。还有可忽略的开销(内存中的数字0-255和整数数组),但除非您小心,否则还会有一些不可忽略的开销,由于过度配置数组而引起。此外,从数组获取元素将涉及两个*内存访问;一个用于元素,一个用于项。 - phihag
2
@SachinBhandari node.js的Buffer早于ArrayBuffer。当时还没有ArrayBuffer,这就是为什么在node.js中创建了Buffer类。浏览器供应商不喜欢Buffer接口,并创建了自己的ArrayBuffer。TypedArray类族提供了对ArrayBuffer内存区域的不同解释。现在,Buffer只是一个Uint8Array(它本身是TypedArray实现之一)。 - phihag
显示剩余7条评论

17

BUFFER是一个临时存储数据的区域,用于将数据从一个位置移动到另一个位置。

为了理解什么是缓冲区,我们需要知道计算机如何处理事物。请参见下面的图表。

这个概念就像你在观看YouTube视频,你可以开始观看视频而不必下载整个视频。如果你的网络速度太慢,你会看到“缓冲”,这意味着计算机正在试图收集数据以便你继续观看该视频。


有点理解。你能给一个实际的例子(代码)来说明这个东西吗? - Krishnadas PC

7

来自http://nodejitsu.com/的解释...

缓冲区是在Node中Buffer类的实例,它专门处理原始二进制数据。每个缓冲区对应在V8之外分配的一些原始内存。缓冲区有点像整数数组,但不可调整大小,并具有为二进制数据专门设计的大量方法。此外,缓冲区中的“整数”每个表示一个字节,因此限于0至255(2^8-1)之间的值,包括边界。

阅读更多:Node.js中的缓冲区


2
是的,我也在文档中读到了这个,但它实际上是什么意思呢?我可以像使用固定大小的数组一样使用缓冲区,只不过它只接受0到255之间的整数作为值吗? - Golo Roden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接