Node.js Undocumented(2)

  Node.js Undocumented(1)
    Node.js Undocumented(2)

    写这种系列blog,是为了监督自己,不然我估计我不会有动力写完。这一节,我将介绍下Buffer这个module。js本身对文本友好,但是处理二进制数据就不是特别方便,因此node.js提供了Buffer模块来帮助你处理二进制数据,毕竟node.js的定位在网络服务端,不能只对文本协议友好。

    Buffer模块本身其实没有多少未公开的方法,重要的方法都在文档里提到了,有两个方法稍微值的提下。

    Buffer.get(idx)

    跟buffer[idx]是一样的,返回的是第idx个字节,返回的结果是数字,如果要转成字符,用String.fromCharCode(code)即可。

    Buffer.inspect()
    返回Buffer的字符串表示,每个字节用十六进制表示,当你调用console.dir的时候打印的就是这个方法返回的结果。

    Buffer真正值的一提的是它的内部实现。Buffer在node.js内部的cpp代码对应的是SlowBuffer类(src/node_buffer.cc),但是两者之间并不是一一对应。对于创建小于8K的Buffer,其实是从一个pool里slice出来,只有大于8K的Buffer才是每次都new一个SlowBuffer。查看源码(lib/buffer.js):

Buffer.poolSize = 8 * 1024;
    if (this.length > Buffer.poolSize) {
      // Big buffer, just alloc one.
      this.parent = new SlowBuffer(this.length);
      this.offset = 0;

    } else {
      // Small buffer.
      if (!pool || pool.length - pool.used < this.length) allocPool();
      this.parent = pool;
      this.offset = pool.used;
      pool.used += this.length;
    }

 

    因此,我们可以修改Buffer.poolSize这个“静态”变量来改变池的大小

    Buffer.poolSize
    Buffer类创建的池大小,大于此值则每次new一个SlowBuffer,否则从池中slice返回一个Buffer,如果池剩余空间不够,则新创建一个SlowBuffer做为池。下面的例子打印这个值并修改成16K:

console.log(Buffer.poolSize);
Buffer.poolSize=16*1024;

   SlowBuffer类
   SlowBuffer类我们可以直接使用的,如果你不想使用Buffer类的话,SlowBuffer类有Buffer模块的所有方法实现,例子如下:

var SlowBuffer=require('buffer').SlowBuffer
var buf=new SlowBuffer(1024)
buf.write("hello",'utf-8');
console.log(buf.toString('utf-8',0,5));
console.log(buf[0]);
var sub=buf.slice(1,3);
console.log(sub.length);

   
    请注意,SlowBuffer默认不是Global的,需要require buffer模块。

    使用建议和性能测试

    Buffer的这个实现告诉我们,要使用好Buffer类还是有讲究的,每次创建小于8K的Buffer最好大小刚好能被8k整除,这样能充分利用空间;或者每次创建大于8K的Buffer,并充分重用。我们来看一个性能测试,分别循环1000万次创建16K,4096和4097大小的Buffer,看看耗时多少:

function benchmark(size,repeats){
    var total=0;
    console.log("create %d size buffer for %d times",size,repeats);
    console.time("times");
    for(var i=0;i<repeats;i++){
        total+=new Buffer(size).length;
    }
    console.timeEnd("times");
}
var repeats=10000000;

console.log("warm up")
benchmark(1024,repeats);
console.log("start benchmark")
benchmark(16*1024,repeats);
benchmark(4096,repeats);
benchmark(4097,repeats);

    创建1024的Buffer是为了做warm up。在我机器上的输出:
    

start benchmark
create 16384 size buffer for 10000000 times
times: 81973ms
create 4096 size buffer for 10000000 times
times: 80452ms
create 4097 size buffer for 10000000 times
times: 138364ms

  
    创建4096和创建4097大小的Buffer,只差了一个字节,耗时却相差非常大,为什么会这样?读者可以自己根据上面的介绍分析下,有兴趣的可以留言。
    另外,可以看到创建16K和创建4K大小的Buffer,差距非常小,平均每秒钟都能创建10万个以上的Buffer,这个效率已经足以满足绝大多数网络应用的需求。

文章转自庄周梦蝶  ,原文发布时间2011-06-04

时间: 2024-09-20 20:11:06

Node.js Undocumented(2)的相关文章

Node.js Undocumented(1)

  node.js的API文档做的不是很好,有些部分干脆没文档,最终还是要看代码才能解决.我这里将记录下看源码过程中看到的一些API并补充一些测试例子.在玩node.js的朋友可以瞧瞧.     process.reallyExit(status)     用于进程主动退出,status设置退出的状态码.请注意,reallyExit退出的进程不会调用'exit'事件,下面的代码不会有任何输出: var interval=setInterval(function(){     process.re

将Node.js项目docker容器化并纳入kubernetes调度编排的实践

  简述 此文档以XXXLogApi-nj项目为例,讲解了将基于Node.js+Express开发的javascript项目容器化的过程.希望以后类似的项目可以以此为参照进行扩展. XXXLogApi-nj本身是一个微服务化的项目,其作用是为系统单纯的收集相关发布日志,以便能及时的展示给用户. ***这份文档的操作,开始于编码完成之后流程.不涉及GIT和JENKINS的等的操作. ***为保持职业操作,涉及公司信息的地方作了敏感化处理. ***在这个系列中,我同时作了spring boot, b

Node.js 服务端实践之 GraphQL 初探

0.问题来了 DT 时代,各种业务依赖强大的基础数据平台快速生长,如何高效地为各种业务提供数据支持,是所有人关心的问题. 现有的业务场景一般是这样的,业务方提出需求,然后寻找开发资源,由后端提供数据,让前端实现各种不同的业务视图.这样的做法存在很多的重复劳动,如果能够将其中通用的内容抽取出来提供给各个业务方反复使用,必然能够节省宝贵的开发时间和开发人力. 前端的解决方案是将视图组件化,各个业务线既可以是组件的使用者,也可以是组件的生产者.那么问题来了,前端通过组件实现了跨业务的复用,后端接口如何

聊天-ASP.net MVC的一个项目里可以使用Node.js做的应用吗?

问题描述 ASP.net MVC的一个项目里可以使用Node.js做的应用吗? 20C 是这样的,最近我们小组在做一个ASP.net MVC 的项目网页,里面有个即时网络聊天室的功能要实现,我看到用Node.js做好像很不错,但是就是不知道.net的项目可以使用吗?

Node.js selenium-webdriver

6.5. Node.js selenium-webdriver 6.5.1. 安装测试环境 6.5.1.1. Selenium Server 下载 Selenium Serverhttp://selenium-release.storage.googleapis.com/2.40/selenium-server-standalone-2.40.0.jar 启动 Selenium Server java -jar selenium-server-standalone-2.40.0.jar 6.5.

CentOS上安装Node.js和mongodb笔记

  CentOS上安装Node.js和mongodb笔记        这篇文章主要介绍了CentOS上安装Node.js和mongodb笔记,本文讲解了Python安装.Node.js安装.npm安装.mongodb驱动安装.mongodb数据库操作测试代码等内容,需要的朋友可以参考下 之前听说过Node.js,只是知道它可以应用于服务器端,但是对很多具体的东西并不了解.今天在QCon上听了袁锋的分享<Node.js脱离了浏览器的Javascript>之后,顿时有了想立刻试一下的冲动. No

node.js的multipart模块问题

问题描述 node.js的multipart模块问题 multipart模块已经安装好了,node.js代码中有一行var parser=new multipart.parser()为什么运行后该行代码会报错:multipart.parser is not a function 解决方案 Node.js工具模块Node.js 模块和包Node.js fs 模块 解决方案二: https://cnodejs.org/topic/4ffed8544764b729026b1da3

Node.js之异常处理

   记得刚刚开始学Node.js时自己尝试着写了一个简单的http服务器,跟以前接触过的php相比感觉更自由,编起码来也更爽了.但是某天发现稍微一个很小的错误就导致整个http进程挂掉了,顿时有种不靠谱的感觉啊,跟php比起来感觉Node.js容错能力确实弱了很多,起码一个php文件出错也不会导致所有的服务都挂掉.           后来接触到Node.js web开发框架后感觉也不是那么轻易就让整个进程都挂掉的,于是便想研究下Node.js究竟是如何来处理各种异常从而避免整个进程挂掉的.

ReactPHP,PHP版的Node.js

前言 前段时间csdn找我约稿.一直忙于项目,也没来及写.十一的时候,学习了下ReactPHP.把了解的一些东西整理成文.难免有疏漏,如发现请指正.原文已经发布到csdn.网址 http://www.csdn.net/article/2015-10-12/2825887 从名字说起 虽然ReactPHP项目已经发展了有4年之久,但是对于其称呼显得有点混乱.在开源中国为其建立的项目主页上,其被命名为React,或者node.PHP.国外的一些的博客谈及这个项目时,多数使用的是ReactPHP.到底