Skip to content

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)😉
    js
    var 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内存有影响
    • 设置越大,读取越快