Node JS Buffer使用理解
JavaScript 起初為瀏覽器而設計,沒有讀取或操作二進位制資料流的機制。Buffer類的引入,則讓NodeJS擁有操作檔案流或網路二進位制流的能力。
Buffer基本概念
Buffer 物件的記憶體分配不是在V8的堆記憶體中,而是Node在C++層面進行記憶體申請,可以理解為在記憶體中單獨開闢了一部分空間,但是使用時分配記憶體則是由Node層面完成的,釋放也是由Node中v8的gc機制自動控制。Buffer基本操作,這裡不在贅述,官方文件很詳細。
Buffer效能對比
通常,網路傳輸中,都需要將資料轉換為Buffer。下面做一個效能對比實驗。
1.使用純字串返回給客戶端
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
使用ab -c 200 -t 100
命令來進行效能測試,發起200個併發客戶端
使用字串,QPS可以達到4019.70,傳輸率為40491.45KB每秒。
2.使用Buffer。將字串轉換為Buffer物件,再發給客戶端。
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
取消Buffer轉換的註釋,同樣使用ab -c 200 -t 100
測試,同樣發起200個併發客戶端。
使用Buffer,QPS達到7130.05,傳輸率為71822.74KB每秒。
效能是原來的177%,極大的節省了伺服器資源。
上面這個對比示例參考於《深入淺出Node JS》。
那麼問題來了,為什麼會有這麼大的效能提升呢?
道理其實很簡單,在NodeJS中,進行http傳輸時,若返回的型別為string
,則會將string
型別的引數,轉換為Buffer,透過NodeJS中的Stream流,一點點的返回給客戶端。如果我們直接返回Buffer型別,就沒有了轉換操作,直接返回,減少了CPU的重複使用率。這一部分邏輯見Node原始碼
在上面效能對比示例中,返回string
時,每次請求都需要將string
裝換成Buffer返回;而直接返回Buffer時,這個Buffer是我們啟動服務時就存放在記憶體中的,每次請求直接返回記憶體中的Buffer即可,因此Buffer使用前後QPS提升了很多。
因此,我們在寫業務程式碼時,部分資源可以預先轉換為Buffer型別(如js、css等靜態資原始檔),直接返回buffer給客戶端,再比如一些檔案轉發的場景,將獲取到的內容儲存為Buffer直接轉發,避免額外的轉換操作。
參考資料:
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2812213/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 徹底理解Node.js中的BufferNode.js
- Node.js之BufferNode.js
- Node.js中的BufferNode.js
- Node.js Buffer解讀Node.js
- Node.js Buffer(緩衝區)Node.js
- 關於 Node.js 之 BufferNode.js
- 8、Node.js Buffer(緩衝區)Node.js
- node.js中緩衝區–BufferNode.js
- 理解 Node.jsNode.js
- 為什麼node.js要引入buffer?淺析緩衝區bufferNode.js
- node.js簡單理解Node.js
- 理解 Node.js(譯文)Node.js
- node Buffer 學習
- Node.js學習之路04——Buffer物件與字串Node.js物件字串
- 學廢了系列 - WebGL與Node.js中的BufferWebNode.js
- 理解 Node.js 的事件輪詢Node.js事件
- 關於node.js中流的理解Node.js
- Node.js(一)——(Node.js安裝及使用,通過Node.js搭建伺服器,模組化及自定義模組,npm/yarn/nvm,內建模組fs的使用,buffer及stream,新聞列表案例)Node.js伺服器NPMYarn
- Node.js 中的緩衝區(Buffer)究竟是什麼?Node.js
- 理解Node.js安裝及模組化Node.js
- 深入理解Node.js-背景瞭解Node.js
- node 核心模組學習之 Buffer
- Node中Buffer 常用API解讀API
- Node中Buffer學習筆記筆記
- Node.js JSON Web Token 使用Node.jsJSONWeb
- [譯]理解 Node.js 事件驅動機制Node.js事件
- Node.js中NPM 使用Node.jsNPM
- 使用 node-inspector 除錯 Node.js除錯Node.js
- 深入理解Node.js的程式與子程式Node.js
- 使用node-inspector線上除錯Node.js除錯Node.js
- electron 使用 Node.js 原生模組Node.js
- Node.js 花盒:Redis 的使用Node.jsRedis
- node.js使用Sequelize 操作mysqlNode.jsMySql
- node.js使用 cnpm 代替 npmNode.jsNPM
- 使用 NestJS 開發 Node.js 應用Node.js
- node 之fs 操作檔案 ? 快取Buffer ?快取
- 《Node.js入門經典》一1.2 使用Node.js能做什麼Node.js
- Chromium Command Buffer原理解析