Node.js Buffer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cyan1614/article/details/73333006
由于Javascript自身只有字符串数据类型,没有二进制数据类型,但在处理像TCP流或者文件流时,必须使用到二进制数据。因此Node.js中,
定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。

Buffer结构

Buffer是一个像Array的对象,但它主要用于操作字节。
Buffer是一个典型的Javascript与C++结合的模块,它将性能相关部分用C++实现,将非性能相关的部分用Javascript实现。

Buffer内存分配

Buffer所占用的内存不是通过V8分配的,属于堆外内存,并且是在Node.js的C++层面实现内存的申请,在Javascript中分配内存并使用的策略。
为了高效地使用申请来的内存,Node .js采用了slab分配机制。slab是一种动态内存管理机制,是一块申请好固定大小的内存区域。
当进行小(8KB大小以下的Buffer)而频繁的Buffer操作时,采用slab的机制进行预先申请和事后分配,
使得Javascript到操作系统之间不必有过多的内存申请方面的系统调用。
如果slab剩余空间不够就会构造新的slab,原slab中剩余的空间会造成浪费。
由于同一个slab可能分配给多个Buffer对象使用,只有这些小Buffer对象在作用域释放并都可以回收时,slab的空间才会被回收。
对于大块的Buffer而言,则直接使用C++层面提供的内存,而无需细腻的分配操作。

Buffer性能

通过预先转换静态内容为Buffer对象,可以有效地减少CPU的重复使用,节省服务器资源。
在Node.js构建的Web应用中,可以选择将页面中的动态内容和静态内容分离,静态内容部分可以通过预先转换为Buffer的方式,使性能得到提升。
由于文件自身是二进制数据,所以在不需要改变内容的场景下,尽量只读取Buffer,然后直接传输,不做额外的转换,避免损耗。

猜你喜欢

转载自blog.csdn.net/Cyan1614/article/details/73333006