摘要:起初為瀏覽器而設(shè)計(jì),沒(méi)有讀取或操作二進(jìn)制數(shù)據(jù)流的機(jī)制。使用純字符串返回給客戶端使用命令來(lái)進(jìn)行性能測(cè)試,發(fā)起個(gè)并發(fā)客戶端使用字符串,可以達(dá)到,傳輸率為每秒。使用,達(dá)到,傳輸率為每秒。
JavaScript 起初為瀏覽器而設(shè)計(jì),沒(méi)有讀取或操作二進(jìn)制數(shù)據(jù)流的機(jī)制。Buffer類的引入,則讓NodeJS擁有操作文件流或網(wǎng)絡(luò)二進(jìn)制流的能力。
Buffer基本概念Buffer 對(duì)象的內(nèi)存分配不是在V8的堆內(nèi)存中,而是Node在C++層面進(jìn)行內(nèi)存申請(qǐng),可以理解為在內(nèi)存中多帶帶開(kāi)辟了一部分空間,但是使用時(shí)分配內(nèi)存則是由Node層面完成的,釋放也是由Node中v8的gc機(jī)制自動(dòng)控制。Buffer基本操作,這里不在贅述,官方文檔很詳細(xì)。
Buffer性能對(duì)比通常,網(wǎng)絡(luò)傳輸中,都需要將數(shù)據(jù)轉(zhuǎn)換為Buffer。下面做一個(gè)性能對(duì)比實(shí)驗(yàn)。
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/命令來(lái)進(jìn)行性能測(cè)試,發(fā)起200個(gè)并發(fā)客戶端
使用字符串,QPS可以達(dá)到4019.70,傳輸率為40491.45KB每秒。
2.使用Buffer。將字符串轉(zhuǎn)換為Buffer對(duì)象,再發(fā)給客戶端。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轉(zhuǎn)換的注釋,同樣使用ab -c 200 -t 100 http://127.0.0.1:8001/測(cè)試,同樣發(fā)起200個(gè)并發(fā)客戶端。
使用Buffer,QPS達(dá)到7130.05,傳輸率為71822.74KB每秒。
性能是原來(lái)的177%,極大的節(jié)省了服務(wù)器資源。
上面這個(gè)對(duì)比示例參考于《深入淺出Node JS》。
道理其實(shí)很簡(jiǎn)單,在NodeJS中,進(jìn)行http傳輸時(shí),若返回的類型為string,則會(huì)將string類型的參數(shù),轉(zhuǎn)換為Buffer,通過(guò)NodeJS中的Stream流,一點(diǎn)點(diǎn)的返回給客戶端。如果我們直接返回Buffer類型,就沒(méi)有了轉(zhuǎn)換操作,直接返回,減少了CPU的重復(fù)使用率。這一部分邏輯見(jiàn)Node源碼https://github.com/nodejs/node/blob/v10.9.0/lib/_http_outgoing.js#L612
在上面性能對(duì)比示例中,返回string時(shí),每次請(qǐng)求都需要將string裝換成Buffer返回;而直接返回Buffer時(shí),這個(gè)Buffer是我們啟動(dòng)服務(wù)時(shí)就存放在內(nèi)存中的,每次請(qǐng)求直接返回內(nèi)存中的Buffer即可,因此Buffer使用前后QPS提升了很多。
因此,我們?cè)趯憳I(yè)務(wù)代碼時(shí),部分資源可以預(yù)先轉(zhuǎn)換為Buffer類型(如js、css等靜態(tài)資源文件),直接返回buffer給客戶端,再比如一些文件轉(zhuǎn)發(fā)的場(chǎng)景,將獲取到的內(nèi)容儲(chǔ)存為Buffer直接轉(zhuǎn)發(fā),避免額外的轉(zhuǎn)換操作。
參考資料:
http://nodejs.cn/api/buffer.html
https://book.douban.com/subje...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108331.html
摘要:在創(chuàng)建時(shí)大小已經(jīng)被確定且是無(wú)法調(diào)整的,在內(nèi)存分配這塊是由層面提供而不是具體后面會(huì)講解。在這里不知道你是否認(rèn)為這是很簡(jiǎn)單的但是上面提到的一些關(guān)鍵詞二進(jìn)制流緩沖區(qū),這些又都是什么呢下面嘗試做一些簡(jiǎn)單的介紹。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多數(shù)人都擁有自己不了解的能力和機(jī)...
摘要:閑談系列不涉及具體的講解,只會(huì)勾勾畫(huà)畫(huà)一些自己認(rèn)為比較重要的特性。我們一般認(rèn)為用兩個(gè)字節(jié)位表示,并且完全囊括了字符集。將其轉(zhuǎn)換成進(jìn)制就是只是表示它們是碼。三的讀取和寫入相關(guān)重要的只有能夠讀寫,才能夠顯示其存在的價(jià)值。 原文地址:http://www.cnblogs.com/DeanCh... 在剛接觸Nodejs的時(shí)候,有些概念總讓學(xué)前端的我感到困惑(雖然大學(xué)的時(shí)候也是在搞后端,世界上...
摘要:是什么存在于全局對(duì)象上,無(wú)需引入模塊即可使用,可見(jiàn)重要性非同一般??梢岳斫馐窃趦?nèi)存中開(kāi)辟的一片區(qū)域,用于存放二進(jìn)制數(shù)據(jù)。大小通過(guò)參數(shù)指定,默認(rèn)情況下是。一般情況下位系統(tǒng)大約是,位系統(tǒng)大約是。 Buffer是什么? Buffer存在于全局對(duì)象上,無(wú)需引入模塊即可使用,可見(jiàn)重要性非同一般??梢岳斫釨uffer是在內(nèi)存中開(kāi)辟的一片區(qū)域,用于存放二進(jìn)制數(shù)據(jù)。Buffer所開(kāi)辟的是堆外內(nèi)存。 B...
摘要:預(yù)備工作序最近正在研究相關(guān)的知識(shí),想著如何能自己實(shí)現(xiàn)協(xié)議。監(jiān)聽(tīng)事件就是協(xié)議的抽象,直接在上面監(jiān)聽(tīng)已有的事件和事件這兩個(gè)事件。表示當(dāng)前數(shù)據(jù)幀為消息的最后一個(gè)數(shù)據(jù)幀,此時(shí)接收方已經(jīng)收到完整的消息,可以對(duì)消息進(jìn)行處理。 A、預(yù)備工作 1、序 最近正在研究 Websocket 相關(guān)的知識(shí),想著如何能自己實(shí)現(xiàn) Websocket 協(xié)議。到網(wǎng)上搜羅了一番資料后用 Node.js 實(shí)現(xiàn)該協(xié)議,倒也沒(méi)...
摘要:從社區(qū)和過(guò)往的經(jīng)驗(yàn)而言異步編程的難題已經(jīng)基本解決無(wú)論是通過(guò)事件還是通過(guò)模式或者流程控制庫(kù)。本章主要介紹了主流的幾種異步編程解決方案這是目前中主要使用的方案。最后因?yàn)槿藗兛偸橇?xí)慣性地以線性的方式進(jìn)行思考以致異步編程相對(duì)較為難以掌握。 前言 如果你想要深入學(xué)習(xí)Node,那你不能錯(cuò)過(guò)《深入淺出Node.js》這本書(shū),它從不同的視角介紹了 Node 內(nèi)在的特點(diǎn)和結(jié)構(gòu)。由首章Node 介紹為索引...
閱讀 2183·2021-11-25 09:43
閱讀 2266·2021-11-24 09:39
閱讀 1573·2021-11-22 12:02
閱讀 2998·2021-11-17 09:33
閱讀 3422·2021-11-15 11:38
閱讀 2760·2021-10-13 09:40
閱讀 1082·2021-09-22 15:41
閱讀 1695·2019-08-30 10:58