Buffer结构
模块结构
Buffer是一个像Array的对象,但它主要用于操作字节。Buffer是一个典型的JavaScript与C++结合的模块,性能相关部分用C++实现,将非性能部分用JavaScript实现。
Buffer对象
- 使用new初始化(误,v6.0.0之前)
- 具有length属性
- 赋值会变为0-256之间。
Buffer内存分配
- Buffer对象的内存不是分配在V8的堆内存中,而是Node的C++层面实现内存的申请。
- Node使用slab分配机制:
1.full
2.partial
3.empty - Node以8KB为界限区分Buffer是大对象还是小对象
小结
简单来说,真正的内存是在Node的C++层面提供的,JavaScript层面只是使用它。当进行小而频繁的Buffer操作时,采用slab的机制进行预先申请和时候分配,使得JavaScript到操作系统之间不必有过多的内存申请方面的系统调用。对于大块的Buffer而言,则是直接使用C++层提供的内存,无需细腻的分配操作。Buffer的转换
因为 new Buffer() 会根据参数的类型而不同,所以如果没有正确地校验传给 new Buffer() 的参数、就可能引起安全性与可靠性问题。为了使 Buffer 实例的创建更可靠, new Buffer() 构造函数已被废弃,建议使用 Buffer.from()、 Buffer.alloc()、和 Buffer.allocUnsafe()。
Buffer.from(array)
返回一个Buffer
,包含传入的字节数组的拷贝。- [
Buffer.from(arrayBuffer[, byteOffset [, length]])
](http://nodejs.cn/s/jGD2qK) 返回一个Buffer
,与传入的ArrayBuffer
共享内存。 Buffer.from(buffer)
返回一个Buffer
,包含传入的Buffer
的内容的拷贝。Buffer.from(string[, encoding])
返回一个Buffer
,包含传入的字符串的拷贝。- [
Buffer.alloc(size[, fill[, encoding]])
](http://nodejs.cn/s/Du96og) 返回一个指定大小且已初始化的Buffer
。 该方法比Buffer.allocUnsafe(size)
慢,但能确保新创建的Buffer
不会包含旧数据。 Buffer.allocUnsafe(size)
与Buffer.allocUnsafeSlow(size)
返回一个指定大小但未初始化的Buffer
。 因为Buffer
是未初始化的,可能包含旧数据。Buffer转字符串
调用to.String([encoding],[start],[end])方法判断Buffer是否支持编码类型
Buffer.isEncoding(encoding)
对于不支持的编码,可以尝试使用iconv-lite,iconvBuffer的拼接
1
2
3
4
5var fs=require("fs");
var rs=fs.createReadStream('./README.md');
var data="";
rs.on("data",(chunk)=>{data+=chunk;});
rs.on("end",()=>{console.log(data)});
Buffer与性能
- apache ab
- 可以通过预先转换静态内容为Buffer对象,可以有效减少CPU的重复使用。
本文结束啦感谢您的阅读