国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node Buffer解讀

Zack / 961人閱讀

摘要:是什么存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。可以理解是在內存中開辟的一片區域,用于存放二進制數據。大小通過參數指定,默認情況下是。一般情況下位系統大約是,位系統大約是。

Buffer是什么?

Buffer存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。
可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。

Buffer的應用場景有哪些?

怎么理解流呢?流是數據的集合(與數據、字符串類似),但是流的數據不能一次性獲取到,數據也不會全部load到內存中,因此流非常適合大數據處理以及斷斷續續返回chunk的外部源。流的生產者與消費者之間的速度通常是不一致的,因此需要buffer來暫存一些數據。buffer大小通過highWaterMark參數指定,默認情況下是16Kb。

存儲需要占用大量內存的數據

Buffer 對象占用的內存空間是不計算在 Node.js 進程內存空間限制上的,所以可以用來存儲大對象,但是對象的大小還是有限制的。一般情況下32位系統大約是1G,64位系統大約是2G。

如何創建Buffer

除了流自動隱式創建Buffer之外,也可以手動創建Buffer,方式如下:

Buffer中存儲的數據已確定

Buffer.from(obj) // obj支持的類型string, buffer, arrayBuffer, array, or array-like object

注意:Buffer.from不支持傳入數字,如下所示:

Buffer.from(1234);

buffer.js:208
    throw new errors.TypeError(
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "value" argument must not be of type number. Received type number
    at Function.from (buffer.js:208:11)
    ...
    

若要傳入數字可以采用傳入數組的方式:

const buf = Buffer.from([1, 2, 3, 4]);
console.log(buf); // 

但是這種方式存在一個問題,當存入不同的數值的時候buffer中記錄的二進制數據會相同,如下所示:

const buf2 = Buffer.from([127, -1]);
console.log(buf2);    

const buf3 = Buffer.from([127, 255]);
console.log(buf3);    

console.log(buf3.equals(buf2));  // true

當要記錄的一組數全部落在0到255(readUInt8來讀取)這個范圍, 或者全部落在-128到127(readInt8來讀取)這個范圍那么就沒有問題,否則的話就強烈不推薦使用Buffer.from來保存一組數。因為不同的數字讀取時應該調用不同的方法。

Buffer存儲數據未確定

Buffer.alloc、Buffer.allocUnsafe、Buffer.allocUnsafeSlow

Buffer.alloc會用0值填充已分配的內存,所以相比后兩者速度上要慢,但是也較為安全。當然也可以通過--zero-fill-buffers flag使allocUnsafe、allocUnsafeSlow在分配完內存后也進行0值填充。

node --zero-fill-buffers index.js

當分配的空間小于4KB的時候,allocUnsafe會直接從之前預分配的Buffer里面slice空間,因此速度比allocUnsafeSlow要快,當大于等于4KB的時候二者速度相差無異。

// 分配空間等于
function createBuffer(fn, size) {
  console.time("buf-" + fn);
  for (var i = 0; i < 100000; i++) {
    Buffer[fn](size);
  }
  console.timeEnd("buf-" + fn);
}
createBuffer("alloc", 4096);
createBuffer("allocUnsafe", 4096);
createBuffer("allocUnsafeSlow", 4096);

// 輸出
buf-alloc:           294.002ms
buf-allocUnsafe:     224.072ms
buf-allocUnsafeSlow: 209.22ms
function createBuffer(fn, size) {
  console.time("buf-" + fn);
  for (var i = 0; i < 100000; i++) {
    Buffer[fn](size);
  }
  console.timeEnd("buf-" + fn);
}
createBuffer("alloc", 4095);
createBuffer("allocUnsafe", 4095);
createBuffer("allocUnsafeSlow", 4095);
// 輸出
buf-alloc:           296.965ms
buf-allocUnsafe:     135.877ms
buf-allocUnsafeSlow: 205.225ms

需要謹記一點:new Buffer(xxxx) 方式已經不推薦使用了

Buffer使用
buffer轉字符串
const buf = Buffer.from("test");
console.log(buf.toString("utf8"));                 // test
console.log(buf.toString("utf8", 0, 2));           // te
buffer轉json
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
console.log(buf.toJSON());    // { type: "Buffer", data: [ 1, 2, 3, 4, 5 ] }
buffer裁剪,裁剪后返回的新的buffer與原buffer指向同一塊內存
buf.slice([start[, end]])
start 起始位置
end 結束位置(不包含)

示例:

var buf1 = Buffer.from("test");
var buf2 = buf1.slice(1, 3).fill("xx");
console.log("buf2 content: " + buf2.toString()); // xx
console.log("buf1 content: " + buf1.toString()); // txxt
buffer拷貝,buffer與數組不同,buffer的長度一旦確定就不再變化,因此當拷貝的源buffer比目標buffer大時只會復制部分的值
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

示例:
var buf1 = Buffer.from("abcdefghijkl");
var buf2 = Buffer.from("ABCDEF");

buf1.copy(buf2, 1);
console.log(buf2.toString()); //Abcdef
buffer相等判斷,比較的是二進制值
buf.equals(otherBuffer)

示例:
const buf1 = Buffer.from("ABC");
const buf2 = Buffer.from("414243", "hex"); 
console.log(buf1.equals(buf2));    // true

除了equals之外,compare其實也可以用于判斷是否相等(當結果為0則相等),不過compare更主要的作用是用于對數組內的buffer實例排序。

buffer是否包含特定值
buf.includes(value[, byteOffset][, encoding])
buf.indexOf(value[, byteOffset][, encoding])

示例:
const buf = Buffer.from("this is a buffer");
console.log(buf.includes("this"));  // true
console.log(buf.indexOf("this"));  // 0
寫入讀取數值

寫入方法:

write{Double| Float | Int16 | Int32| UInt16 | UInt32 }{BE|LE}(value, offset)

write{Int | UInt}{BE | LE}(value, offset, bytelength) // 此方法提供了更靈活的位數表示數據(比如3位、5位)

write{Int8 | Unit8}(value, offset)

讀取方法:

write{Double| Float | Int16 | Int32 | UInt16 | UInt32 }{BE|LE}(offset)

read{Int | UInt}{BE | LE}(offset, byteLength)

read{Int8 | Unit8}(offset)

Double、Float、Int16、Int32、UInt16、UInt32既確定了表征數字的位數,也確定了是否包含負數,因此定義了不同的數據范圍。同時由于表征數字的位數都超過8位,無法用一個字節來表示,因此就涉及到了計算機的字節序區分(大端字節序與小端字節序)

關于大端小端的區別可以這么理解:數值的高位在buffer的起始位置的是大端,數值的低位buffer的起始位置則是小端

const buf = Buffer.allocUnsafe(2);
buf.writeInt16BE(256, 0)  
console.log(buf);           //  
buf.writeInt16LE(256, 0)
console.log(buf);           // 

https://tool.lu/hexconvert/ 這里可以查看數值的不同進制之間的轉換,如果是大端的話,則直接按順序(0100)拼接16進制即可,如果是小端則需要調換一下順序才是正確的表示方式。

buffer合并
Buffer.concat(list[, totalLength]) //totalLength不是必須的,如果不提供的話會為了計算totalLength會多一次遍歷

const buf1 = Buffer.from("this is");
const buf2 = Buffer.from(" funny");
console.log(Buffer.concat([buf1, buf2], buf1.length + buf2.length));
// 
清空buffer

清空buffer數據最快的辦法是buffer.fill(0)

buffer模塊與Buffer的關系

Buffer是全局global上的一個引用,指向的其實是buffer.Buffer

 const buffer = require("buffer");
 console.log(buffer.Buffer === Buffer); //true

buffer模塊上還有其他一些屬性和方法

const buffer = require("buffer");
console.log(buffer);
{ Buffer:
   { [Function: Buffer]
     poolSize: 8192,
     from: [Function: from],
     alloc: [Function: alloc],
     allocUnsafe: [Function: allocUnsafe],
     allocUnsafeSlow: [Function: allocUnsafeSlow],
     isBuffer: [Function: isBuffer],
     compare: [Function: compare],
     isEncoding: [Function: isEncoding],
     concat: [Function: concat],
     byteLength: [Function: byteLength],
     [Symbol(node.isEncoding)]: [Function: isEncoding] },
  SlowBuffer: [Function: SlowBuffer],
  transcode: [Function: transcode],
  INSPECT_MAX_BYTES: 50,
  kMaxLength: 2147483647,
  kStringMaxLength: 1073741799,
  constants: { MAX_LENGTH: 2147483647, MAX_STRING_LENGTH: 1073741799 } }

上面的kMaxLength與MAX_LENGTH代表了新建buffer時內存大小的最大值,當超過限制值后就會報錯

32為機器上是(2^30)-1(~1GB)

64位機器上是(2^31)-1(~2GB)

Buffer釋放

我們無法手動對buffer實例進行GC,只能依靠V8來進行,我們唯一能做的就是解除對buffer實例的引用

參考資料

http://cenalulu.github.io/lin...

http://www.ruanyifeng.com/blo...

https://medium.freecodecamp.o...

https://www.barretlee.com/blo...

https://medium.freecodecamp.o...

http://www.runoob.com/nodejs/...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95080.html

相關文章

  • Node.js process模塊解讀

    摘要:默認情況下,會打印堆棧信息到然后退出進程。適用于父子進程之間發送消息,關于如何創建父子進程會放在模塊中進行。信號雖然也是用于請求終止進程,但是它與有所不同,進程可以選擇響應還是忽略此信號。 process存在于全局對象上,不需要使用require()加載即可使用,process模塊主要做兩方面的事情 讀:獲取進程信息(資源使用、運行環境、運行狀態) 寫:執行進程操作(監聽事件、調度任...

    Riddler 評論0 收藏0
  • Node.js - 200 多行代碼實現 Websocket 協議

    摘要:預備工作序最近正在研究相關的知識,想著如何能自己實現協議。監聽事件就是協議的抽象,直接在上面監聽已有的事件和事件這兩個事件。表示當前數據幀為消息的最后一個數據幀,此時接收方已經收到完整的消息,可以對消息進行處理。 A、預備工作 1、序 最近正在研究 Websocket 相關的知識,想著如何能自己實現 Websocket 協議。到網上搜羅了一番資料后用 Node.js 實現該協議,倒也沒...

    張巨偉 評論0 收藏0
  • node之stream(上)——readable

    摘要:上游水源通過里中的方法流入水電站中。當在接收數據中出現錯誤時發出。暫停可讀流,不再發出事件恢復可讀流,繼續發出事件把這個可讀流的輸出傳遞給指定的流,兩個流組成一個管道。 題外話 該文章整合了多篇網絡文章(整合之處已設置超鏈接,可點擊直接了解原文),目的僅僅是為了和大伙分享,更加通俗易懂的了解流的各個流程的初始。本人也是node的初學菜鳥,有描述錯誤或誤人子弟的地方多請大神們多多指出。 ...

    zhangrxiang 評論0 收藏0
  • Node.js 高級進階之 fs 文件模塊學習

    摘要:回調函數提供兩個參數和,表示有沒有錯誤發生,是文件內容。文件關閉第一個參數文件時傳遞的文件描述符第二個參數回調函數回調函數有一個參數錯誤,關閉文件后執行。 showImg(//img.mukewang.com/5d3f890d0001836113660768.jpg); 人所缺乏的不是才干而是志向,不是成功的能力而是勤勞的意志。 —— 部爾衛 文章同步到github博客:https:/...

    verano 評論0 收藏0
  • nginx http模塊配置參數解讀

    摘要:名稱默認配置作用域官方說明中文解讀模塊是否開啟對后端的緩沖指定一個連接到代理服務器的超時時間,單位為秒,需要注意的是這個時間最好不要超過秒。 序 本文主要解析一下nginx http模塊配置參數。主要分socket相關參數,對clinet請求的buffer參數以及對response的buffer參數。 socket 名稱 默認配置 作用域 官方說明 中文解讀 模塊 sendf...

    pf_miles 評論0 收藏0

發表評論

0條評論

Zack

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<