理解Buffer

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,iconv

    Buffer的拼接

    1
    2
    3
    4
    5
    var 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的重复使用。
本文结束啦感谢您的阅读
undefined