深入浅出Node.js学习笔记(六)

理解Buffer

1. Buffer结构

Buffer是一个像Array的对象,但它主要用于操作字节。

1.1 模块结构

Buffer是一个典型的JavaScript与C++结合的模块,它将性能相关的部分用C++实现,将非性能相关的部分用JavaScript实现。

Buffer所占用的内存不是通过V8分配的,属于堆外内存。

由于Buffer太过常见,Node在进程启动时就已经加装了它,并将其放在全局对象(global)上。

1.2 Buffer对象

Buffer对象类似于数组,它的元素为16进制的两位数,即0到255的数值。

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>

1.3 Buffer内存分配

Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存的申请的。因为 处理大量的字节数据不能采用需要一点内存就想操作系统申请一旦内存的方式,这可能造成大量的内存申请的系统调用,对操作系统有一定的压力。为此Node在内存的使用上应用的是在C++层面申请内存、在JavaScript中分配内存的策略。

为了高效地使用申请来的内存,Node采用了slab分配机制。

slab是一种动态内存管理机制。

slab是一块申请好的固定大小的内存区域。

slab的3中状态:

  1. full:完全分配状态;
  2. partial:部分分配状态;
  3. empty:没有被分配状态;

new一个指定大小的Buffer对象:

new Buffer(size)

Node以8KB为界限来区分Buffer是大对象还是小对象。

8KB的值也就是每个slab的大小值,在JavaScript层面,以它作为单位单元进行内存分配。

  1. 分配小Buffer对象

    如果指定Buffer的大小少于8KB,Node会按照小对象的方式进行分配。Buffer的分配过程中主要使用一个局部变量作为中间处理对象,处于分配状态的slab单元都指向它。

  2. 分配大buffer对象

    如果需要超过8KB的Buffer对象,将会直接分配一个SlowBuffer对象作为slab作为slab单元,这个slab单元将会被这个大Buffer对象独占。

  3. 小结

    真正的内存是在Node的C++层面提供的,JavaScript层数只是使用它。当进行小而频繁的Buffer操作时,采用slab的机制进行预先申请和事后分配,使得JavaScript到操作系统之间不必有过多的内存申请方面的系统调用。对于大Buffer而言,则直接使用C++层面提供的内存,而无需细腻的分配操作。

2. Buffer的转换

Buffer对象可以也字符串之间相互转换。支持的字符串编码有:

  1. ASCII
  2. UTF-8
  3. UTF-16LE/UCS-2
  4. Base64
  5. Binary
  6. Hex

2.1 字符串转Buffer

字符串转Buffer对象主要通过构造函数完成的:

new Buffer(str,[encoding]);

2.2 Buffer转字符串

Buffer对象的toString()可以将Buffer对象转换为字符串。

buf.toString([encoding],[start],[end]);

2.3 Buffer不支持的编码类型

Buffer提供了一个isEncoding()函数来判断编码是否支持转换。

Buffer.isEncoding(encodinh)

3. Buffer的拼接

Buffer在使用场景中,通常是以一段一段的方式传输。

3.1 乱码是如何产生的

对于任意长度的Buffer而言,宽字节字符串都有可能存在被截取的情况,这是导致乱码产生的原因。

3.2 setEncoding()与string_decoder()

setEncoding():设置编码的方法,让data事件中传递的不再是一个Buffer对象,而是编码后的字符串。

string_decoder模块是StringDecoder的实例对象。

3.3 正确拼接Buffer

正确的拼接方式是用一个数组存储接收到的所有Buffer片段的总长度,然后调用Buffer.concat()方法生成一个合并的Buffer对象。Buffer。concat()方法封装了从小Buffer对象向大Buffer对象的复制过程。

4. Buffer与性能

通过预先转换静态内容为Buffer对象,可以有效地减少CPU的重复使用,节省服务器资源。在Node构建的Web应用中,可以选择将页面的动态内容和静态内容分离,静态内容部分可以通过预先转换为Buffer的方式,使得性能得到提升。

  • 文件读取

    Buffer的使用在文件读取时,有一个highWaterMark设置对性能的影响至关重要。

    读取一个相同的大文件时,highWaterMark值的大小与读取速度的关系:该值越大,读取速度越快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 2. NODE模块端实现 2.2 node模块的实现 引入模块: 路径分析 文件定位 编译执行 2.2.1 优先从...
    yozosann阅读 2,121评论 0 0
  • 在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作上,还要处理大量二进...
    Upcccz阅读 1,157评论 0 0
  • Buffer 是一个 Javascript 与 C++ 结合的模块,它将性能相关部分用 C++ 实现,将非性能相关...
    杰哥长得帅阅读 2,523评论 0 2
  • 我听过最美的声音 也不及此 你投进心湖的石子 荡开涟漪的是尘世的惊鸿艳影 ——于...
    法学院的猫阅读 207评论 0 2
  • 亲爱的阿奇: 今天下午我什么都不想做,就出去走一走。我看到路边开了一朵花,非常美丽。想起你最喜欢花朵了,我就把它摘...
    冷小奥阅读 422评论 0 1