<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    Node.js Undocumented(2)

    Posted on 2011-06-04 18:09 dennis 閱讀(3549) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): node.js

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

        寫(xiě)這種系列blog,是為了監(jiān)督自己,不然我估計(jì)我不會(huì)有動(dòng)力寫(xiě)完。這一節(jié),我將介紹下Buffer這個(gè)module。js本身對(duì)文本友好,但是處理二進(jìn)制數(shù)據(jù)就不是特別方便,因此node.js提供了Buffer模塊來(lái)幫助你處理二進(jìn)制數(shù)據(jù),畢竟node.js的定位在網(wǎng)絡(luò)服務(wù)端,不能只對(duì)文本協(xié)議友好。

        Buffer模塊本身其實(shí)沒(méi)有多少未公開(kāi)的方法,重要的方法都在文檔里提到了,有兩個(gè)方法稍微值的提下。

        Buffer.get(idx)

        跟buffer[idx]是一樣的,返回的是第idx個(gè)字節(jié),返回的結(jié)果是數(shù)字,如果要轉(zhuǎn)成字符,用String.fromCharCode(code)即可。

        Buffer.inspect()
        返回Buffer的字符串表示,每個(gè)字節(jié)用十六進(jìn)制表示,當(dāng)你調(diào)用console.dir的時(shí)候打印的就是這個(gè)方法返回的結(jié)果。

        Buffer真正值的一提的是它的內(nèi)部實(shí)現(xiàn)。Buffer在node.js內(nèi)部的cpp代碼對(duì)應(yīng)的是SlowBuffer類(lèi)(src/node_buffer.cc),但是兩者之間并不是一一對(duì)應(yīng)。對(duì)于創(chuàng)建小于8K的Buffer,其實(shí)是從一個(gè)pool里slice出來(lái),只有大于8K的Buffer才是每次都new一個(gè)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這個(gè)“靜態(tài)”變量來(lái)改變池的大小

        Buffer.poolSize
        Buffer類(lèi)創(chuàng)建的池大小,大于此值則每次new一個(gè)SlowBuffer,否則從池中slice返回一個(gè)Buffer,如果池剩余空間不夠,則新創(chuàng)建一個(gè)SlowBuffer做為池。下面的例子打印這個(gè)值并修改成16K:
    console.log(Buffer.poolSize);
    Buffer.poolSize
    =16*1024;

       SlowBuffer類(lèi)
       SlowBuffer類(lèi)我們可以直接使用的,如果你不想使用Buffer類(lèi)的話,SlowBuffer類(lèi)有Buffer模塊的所有方法實(shí)現(xiàn),例子如下:
    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);
       
        請(qǐng)注意,SlowBuffer默認(rèn)不是Global的,需要require buffer模塊。

        使用建議和性能測(cè)試

        Buffer的這個(gè)實(shí)現(xiàn)告訴我們,要使用好Buffer類(lèi)還是有講究的,每次創(chuàng)建小于8K的Buffer最好大小剛好能被8k整除,這樣能充分利用空間;或者每次創(chuàng)建大于8K的Buffer,并充分重用。我們來(lái)看一個(gè)性能測(cè)試,分別循環(huán)1000萬(wàn)次創(chuàng)建16K,4096和4097大小的Buffer,看看耗時(shí)多少:
    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);

        創(chuàng)建1024的Buffer是為了做warm up。在我機(jī)器上的輸出:
        
    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

      
        創(chuàng)建4096和創(chuàng)建4097大小的Buffer,只差了一個(gè)字節(jié),耗時(shí)卻相差非常大,為什么會(huì)這樣?讀者可以自己根據(jù)上面的介紹分析下,有興趣的可以留言。
        另外,可以看到創(chuàng)建16K和創(chuàng)建4K大小的Buffer,差距非常小,平均每秒鐘都能創(chuàng)建10萬(wàn)個(gè)以上的Buffer,這個(gè)效率已經(jīng)足以滿(mǎn)足絕大多數(shù)網(wǎng)絡(luò)應(yīng)用的需求。

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线观看片免费人成视频无码| 亚洲中文字幕无码一久久区| 久久久久久国产精品免费免费男同| 亚洲精品无AMM毛片| 亚洲成人精品久久| 伊人久久大香线蕉亚洲五月天| 永久免费毛片手机版在线看| 啦啦啦完整版免费视频在线观看 | 91黑丝国产线观看免费| 国产免费网站看v片在线| 国产99久久亚洲综合精品| 美女视频黄免费亚洲| 亚洲欧洲校园自拍都市| 国产AV无码专区亚洲AVJULIA| 亚洲午夜AV无码专区在线播放 | 国产精品亚洲精品久久精品| 亚洲高清视频在线| 亚洲av无码片在线观看| 亚洲精品日韩中文字幕久久久| 久久亚洲一区二区| 亚洲成AV人片在线观看WWW| 国产亚洲欧洲Aⅴ综合一区| 亚洲不卡无码av中文字幕| 免费永久在线观看黄网站| 国产成人免费片在线视频观看| 免费高清小黄站在线观看| 啦啦啦高清视频在线观看免费| 182tv免费观看在线视频| 99久久精品免费精品国产| 国产成人精品免费久久久久| 国产婷婷成人久久Av免费高清| 国偷自产一区二区免费视频| 免费日本一区二区| 久久精品视频免费播放| 99久久99热精品免费观看国产| 99久久久国产精品免费牛牛四川| 91久久青青草原线免费| 成人午夜免费福利视频| 青春禁区视频在线观看直播免费| 无码视频免费一区二三区| 日韩高清在线高清免费|