开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
前言
当需要处理大文件或者大数据时基本都是推荐使用 buffer,因为它比字符串更少,而且在传输的过程中会有更大的性能优势。所以今天主要是对 buffer对象 进行深入的学习记录。
Buffer对象
Buffer对象用于表示固定长度的字节序列
// 创建一个长度为 10、以零填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10 的 Buffer,
// 其中全部填充了值为 `1` 的字节。
const buf2 = Buffer.alloc(10, 1);
var str="hello Jasen";
var buf = new Buffer.from(str,'utf-8');
console.log(buf);
//输出:<Buffer 68 65 6c 6c 6f 20 4a 61 73 65 6e>
观察输出的结果,Buffer对象类似一个数组。Buffer对象中的每个元素都是16进制的两位数(即0到255的数值)
对Buffer某个元素赋值如果小于0的,会逐次加256,直到得到一个0到255范围的值,如果大于255则逐次减256,直到得到0-255范围得值,如果是小数的话,则直接取整。
使用场景
- 可用于处理大量二进制数据
- 处理图片、文件接收上传、网络协议等等
Buffer 提高性能
大部分网络传输的时候会使用通过使用字符串,这难免需要转换成Buffer,以二进制方式进行数据传输。如果我们直接预先转换为Buffer 再进行传输,那么在传输过程中无需做额外的转换,也避免了损耗,使性能得到提升。
以下通过ab进行一次性能测试,发起200个并发客户端请求的结果,QPS提升的不是很高,但还是有一点点的提升,可以复制代码执行下,是否结果和我一样
Buffer与Stream
Stream 也是Node的核心模块,数据就像流水一样,流是对输入输出设备的抽象,是一组有序的、有起点和终点的字节数据传输手段。
Node.js 中有四种基本的流类型:
- Writable - 可写入数据的流(例如 fs.createWriteStream())
- Readable - 可读取数据的流(例如 fs.createReadStream())。
- Duplex - 可读又可写的流(例如 net.Socket)。
- Transform - 在读写过程中可以修改或转换数据的
Duplex流
使用场景:文件分片上传下载,比如下载电影时可以边下载边看,这样一个实现过程。
Buffer 对象也是经常面试的时候会被问到的一个考题。无论是写入缓冲区、从缓冲区读取数据、buffer 转json都是经常会遇到的,且浏览器传递都是以二进制进行传输的,所以使用buffer 会更加有优势。