国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Node.js Buffer用法解讀

2024-05-06 15:33:59
字體:
來源:轉載
供稿:網友

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 01 02 03 04>

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

const buf2 = Buffer.from([127, -1]);console.log(buf2);   // <Buffer 7f ff>const buf3 = Buffer.from([127, 255]);console.log(buf3);  // <Buffer 7f ff>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的時候二者速度相差無異。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 河池市| 汉寿县| 崇明县| 临清市| 阿瓦提县| 淅川县| 咸丰县| 鸡泽县| 巴南区| 嘉黎县| 清远市| 延川县| 阿拉尔市| 赤峰市| 阿勒泰市| 玉溪市| 封丘县| 阿克| 囊谦县| 北海市| 临泉县| 通州区| 双城市| 定日县| 府谷县| 和静县| 兴业县| 南川市| 鄂州市| 陇西县| 德阳市| 白水县| 宜宾市| 南部县| 陆丰市| 安宁市| 青浦区| 通化县| 驻马店市| 甘孜县| 巴中市|