当前位置: 首页 > 后端技术 > Node.js

简单Node.js学习笔记(6)

时间:2023-04-03 14:30:10 Node.js

理解Buffer1。Buffer结构Buffer和Array一样是一个对象,但是主要用来操作字节。1.1模块结构Buffer是一个典型的JavaScript和C++结合的模块。它用C++实现与性能相关的部分,用JavaScript实现与性能无关的部分。Buffer占用的内存不是V8分配的,属于堆外内存。因为Buffer太普通了,所以Node在进程启动的时候就已经安装好了,放到了全局对象(global)上。1.2Buffer对象Buffer对象类似于一个数组,它的元素是十六进制的两位数,即0到255之间的值。varstr="深入浅出node.js";varbuf=newBuffer(str,'utf-8');控制台日志(buf);//=>1.3Buffer内存分配Buffer对象的内存分配不在V8的堆内存中,而是在内存申请中在Node.js的C++级别实现。因为处理大量的字节数据,一旦需要一点内存就不能采用要求操作系统申请内存的方式,这可能会导致大量的系统调用申请内存,对运行造成一定的压力系统。为此,Node在内存的使用上采用了在C++层面申请内存,在JavaScript中分配内存的策略。为了高效地使用申请的内存,Node采用了slab分配机制。Slab是一种动态内存管理机制。slab是申请的固定大小的内存区域。slab的3种状态:full:完全分配状态;partial:部分分配状态;empty:未分配状态;new一个指定大小的Buffer对象:newBuffer(size)Node以8KB为界限来区分Buffer是大对象还是小对象。8KB的值是每个slab的大小值。在JavaScript层面,它被用作内存分配的单位单元。分配小的Buffer对象如果指定的Buffer的大小小于8KB,Node将把它分配为小对象。在Buffer的分配过程中,主要使用一个局部变量作为中间处理对象,所有处于分配状态的slab单元都指向它。分配一个大的buffer对象如果需要一个超过8KB的Buffer对象,会直接分配一个SlowBuffer对象作为一个slab作为一个slab单元,这个slab单元将被这个大Buffer对象独占。总结真正的内存是在Node的C++层提供的,JavaScript层只是使用它。在进行小而频繁的Buffer操作时,通过slab机制进行预申请和后分配,使得JavaScript和操作系统之间不需要过多的系统调用来申请内存。对于大缓冲区,直接使用C++层提供的内存,无需精细的分配操作。2.Buffer转换Buffer对象也可以在字符串之间进行转换。支持的字符串编码有:ASCIIUTF-8UTF-16LE/UCS-2Base64BinaryHex2.1StringtoBufferStringtoBuffer对象主要是通过构造函数完成的:newBuffer(str,[encoding]);2.2BuffertoStringBuffer对象的toString()可以将Buffer对象转换为字符串。buf.toString([编码],[开始],[结束]);2.3Buffer不支持的编码类型Buffer提供了一个isEncoding()函数来判断编码是否支持转换。Buffer.isEncoding(encodinh)3.BufferconcatenationBuffer在使用场景中通常是逐段传输的。3.1乱码是如何产生的对于任意长度的Buffer,宽字节的字符串都可能被截取,这就是乱码产生的原因。3.2setEncoding()和string_decoder()setEncoding():设置编码的方法,使数据事件不再是Buffer对象,而是经过编码的字符串。string_decoder模块是StringDecoder的一个实例对象。3.3Buffer的正确拼接正确的拼接方式是用数组存储所有接收到的Buffer分片的总长度,然后调用Buffer.concat()方法生成一个合并后的Buffer对象。缓冲。concat()方法封装了从一个小的Buffer对象到一个大的Buffer对象的复制过程。4.Buffer和性能通过预先将静态内容转换为Buffer对象,可以有效减少CPU重用,节省服务器资源。在Node搭建的Web应用中,可以选择将页面的动态内容和静态内容分离,静态内容可以提前转换成Buffer,这样可以提高性能。文件读取Buffer的使用在读取文件时,有一个highWaterMark的设置,对性能有至关重要的影响。读取同一个大文件时,highWaterMark的值与读取速度的关系:值越大,读取速度越快。