摘要:起初為瀏覽器而設計,沒有讀取或操作二進制數據流的機制。使用純字符串返回給客戶端使用命令來進行性能測試,發起個并發客戶端使用字符串,可以達到,傳輸率為每秒。使用,達到,傳輸率為每秒。
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 < 10240; i++) { hello += "a"; } console.log(`Hello:${hello.length}`) // hello = Buffer.from(hello); http.createServer((req, res) => { res.writeHead(200); res.end(hello); }).listen(8001);
使用ab -c 200 -t 100 http://127.0.0.1:8001/命令來進行性能測試,發起200個并發客戶端
使用字符串,QPS可以達到4019.70,傳輸率為40491.45KB每秒。
2.使用Buffer。將字符串轉換為Buffer對象,再發給客戶端。const http = require("http"); let hello = "" for (var i = 0; i < 10240; i++) { hello += "a"; } console.log(`Hello:${hello.length}`) hello = Buffer.from(hello); http.createServer((req, res) => { res.writeHead(200); res.end(hello); }).listen(8001);
取消Buffer轉換的注釋,同樣使用ab -c 200 -t 100 http://127.0.0.1:8001/測試,同樣發起200個并發客戶端。
使用Buffer,QPS達到7130.05,傳輸率為71822.74KB每秒。
性能是原來的177%,極大的節省了服務器資源。
上面這個對比示例參考于《深入淺出Node JS》。
道理其實很簡單,在NodeJS中,進行http傳輸時,若返回的類型為string,則會將string類型的參數,轉換為Buffer,通過NodeJS中的Stream流,一點點的返回給客戶端。如果我們直接返回Buffer類型,就沒有了轉換操作,直接返回,減少了CPU的重復使用率。這一部分邏輯見Node源碼https://github.com/nodejs/node/blob/v10.9.0/lib/_http_outgoing.js#L612
在上面性能對比示例中,返回string時,每次請求都需要將string裝換成Buffer返回;而直接返回Buffer時,這個Buffer是我們啟動服務時就存放在內存中的,每次請求直接返回內存中的Buffer即可,因此Buffer使用前后QPS提升了很多。
因此,我們在寫業務代碼時,部分資源可以預先轉換為Buffer類型(如js、css等靜態資源文件),直接返回buffer給客戶端,再比如一些文件轉發的場景,將獲取到的內容儲存為Buffer直接轉發,避免額外的轉換操作。
參考資料:
http://nodejs.cn/api/buffer.html
https://book.douban.com/subje...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108331.html
摘要:在創建時大小已經被確定且是無法調整的,在內存分配這塊是由層面提供而不是具體后面會講解。在這里不知道你是否認為這是很簡單的但是上面提到的一些關鍵詞二進制流緩沖區,這些又都是什么呢下面嘗試做一些簡單的介紹。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多數人都擁有自己不了解的能力和機...
摘要:閑談系列不涉及具體的講解,只會勾勾畫畫一些自己認為比較重要的特性。我們一般認為用兩個字節位表示,并且完全囊括了字符集。將其轉換成進制就是只是表示它們是碼。三的讀取和寫入相關重要的只有能夠讀寫,才能夠顯示其存在的價值。 原文地址:http://www.cnblogs.com/DeanCh... 在剛接觸Nodejs的時候,有些概念總讓學前端的我感到困惑(雖然大學的時候也是在搞后端,世界上...
摘要:是什么存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。可以理解是在內存中開辟的一片區域,用于存放二進制數據。大小通過參數指定,默認情況下是。一般情況下位系統大約是,位系統大約是。 Buffer是什么? Buffer存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。 B...
摘要:預備工作序最近正在研究相關的知識,想著如何能自己實現協議。監聽事件就是協議的抽象,直接在上面監聽已有的事件和事件這兩個事件。表示當前數據幀為消息的最后一個數據幀,此時接收方已經收到完整的消息,可以對消息進行處理。 A、預備工作 1、序 最近正在研究 Websocket 相關的知識,想著如何能自己實現 Websocket 協議。到網上搜羅了一番資料后用 Node.js 實現該協議,倒也沒...
摘要:從社區和過往的經驗而言異步編程的難題已經基本解決無論是通過事件還是通過模式或者流程控制庫。本章主要介紹了主流的幾種異步編程解決方案這是目前中主要使用的方案。最后因為人們總是習慣性地以線性的方式進行思考以致異步編程相對較為難以掌握。 前言 如果你想要深入學習Node,那你不能錯過《深入淺出Node.js》這本書,它從不同的視角介紹了 Node 內在的特點和結構。由首章Node 介紹為索引...
閱讀 2170·2021-11-25 09:43
閱讀 2249·2021-11-24 09:39
閱讀 1540·2021-11-22 12:02
閱讀 2984·2021-11-17 09:33
閱讀 3408·2021-11-15 11:38
閱讀 2718·2021-10-13 09:40
閱讀 1065·2021-09-22 15:41
閱讀 1687·2019-08-30 10:58