6理解buffer
- buffer
- 各种场景下,要处理大量二进制数据,buffer应用而生
1、buffer结构
buffer的基本信息、内存分配 1、模块结构(核心模块)
- 典型的JavaScript与C++结合的模块 2、buffer对象(6.1.js) <<< @/back-end/Lang/NodeJs/Book/note/6-buffer/js/6.1.js
js
var str = "深入浅出node.js";
var buf = new Buffer(str, 'utf-8');
console.log(buf);
// => <Buffer e6 b7 b1 e5 85 a5 e6 b5 85 e5 87 ba 6e 6f 64 65 2e 6a 73>
- 一个元素是16进制
两位
数,一个元素即一字节 - 一个
中文字符
在UTF-8编码下占用3
个字节 字母
和半角标点符号
占用1
个字节 3、buffer内存分配- 采用slab分配机制
- full、partial、empty状态
- 以8kb为界线分配
- 小于8kb,
- 分配在一个8kb的slab单元中,
- 剩余空间足够,则再次分配到这个slab单元中
- 空间不足,创建新的slab
- 一直被占用,空间不被释放
- 大于8kb
- 直接分配一个SlowBuffer对象作为slab单元,独占
- 真正内存是c++层面提供的,js层面只是使用它
2、Buffer的转换
buffer转换 1、字符串和buffer之间转化(6.2.js)
js
// buffer/字符串 转换
const { Buffer } = require("buffer");
// new Buffer(str, [encoding]);
// 创建1
const buf = Buffer.from("aaa", "UTF-8");
console.log(buf);
// 转换1
const str1 = buf.toString("UTF-8");
console.log(str1);
// 写入
buf.write("b", 0);
console.log(buf);
// buf.toString([encoding], [start], [end])
// 转换2
const str2 = buf.toString("UTF-8");
console.log(str2);
// 创建2
const buf1 = Buffer.from("aaa", "base64");
console.log(buf1);
2、buffer不支持的编码类型 - iconv-lite(纯JavaScript实现) - iconv(C++调用libiconv库完成)
3、buffer的拼接
fs读取大文件是时候 buffer 如何拼接 最终思路是(6.3.4.js) 将每一部分的buffer放到一个数组; 并记录整个buffer的长度; 最后拼接起来
4、buffer与性能
网络传输中,使用buffer传输,提高网络吞吐率
- node 6.4.js (启动一个8001服务,res.end(buffer)😉
jsvar http = require("http"); var { Buffer } = require("buffer"); var helloworld = ""; for (var i = 0; i < 1024 * 10; i++) { helloworld += "a"; } helloworld = Buffer.from(helloworld); http .createServer(function (req, res) { res.writeHead(200); res.end(helloworld); }) .listen(8001);
ab -c 200 -t 100 http://127.0.0.1:8001/
- 文件读取时,highWaterMark设置会对buffer内存有影响
- 设置越大,读取越快