日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js Undocumented(2)

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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),但是兩者之間并不是一一對應。對于創建小于8KBuffer,其實是從一個poolslice出來,只有大于8KBuffer才是每次都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的,需要requirebuffer模塊。

使用建議和性能測試

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是為了做warmup。在我機器上的輸出:

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,這個效率已經足以滿足絕大多數網絡應用的需求。

轉載于:https://blog.51cto.com/aliapp/1327670

總結

以上是生活随笔為你收集整理的Node.js Undocumented(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。