最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs的10個(gè)性能優(yōu)化技巧

 更新時(shí)間:2014年07月15日 10:50:09   投稿:hebedich  
在我接觸JavaScript(無(wú)論瀏覽器還是NodeJS)的時(shí)間里,總是遇到有朋友有多線程的需求。而在NodeJS方面,有朋友甚至直接說(shuō)到,NodeJS是單線程的,無(wú)法很好的利用多核CPU。那么我們?cè)谑褂眠^(guò)程中,就要非常注意性能優(yōu)化了

下面是我們使用Node.js時(shí)遵循的10個(gè)性能規(guī)則:

1. 避免使用同步代碼

在設(shè)計(jì)上,Node.js是單線程的。為了能讓一個(gè)單線程處理許多并發(fā)的請(qǐng)求,你可以永遠(yuǎn)不要讓線程等待阻塞,同步或長(zhǎng)時(shí)間運(yùn)行的操作。Node.js的一個(gè)顯著特征是:它從上到下的設(shè)計(jì)和實(shí)現(xiàn)都是為了實(shí)現(xiàn)異步。這讓它非常適合用于事件型程序。

不幸的是,還是有可能會(huì)發(fā)生同步/阻塞的調(diào)用。例如,許多文件系統(tǒng)操作同時(shí)擁有同步和異步的版本,比如writeFile和writeFileSync。即使你用代碼來(lái)控制同步方法,但還是有可能不注意地用到阻塞調(diào)用的外部函數(shù)庫(kù)。當(dāng)你這么做時(shí),對(duì)性能的影響是極大的。

// Good: write files asynchronously
fs.writeFile('message.txt', 'Hello Node', function (err) {
 console.log("It's saved and the server remains responsive!");
});
 
// BAD: write files synchronously
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");

我們的初始化log在實(shí)現(xiàn)時(shí)無(wú)意地包含了一個(gè)同步調(diào)用來(lái)將內(nèi)容寫入磁盤。如果我們不做性能測(cè)試那么就會(huì)很容易忽略這個(gè)問(wèn)題。當(dāng)以developer box中一個(gè)node.js實(shí)例來(lái)作為標(biāo)準(zhǔn)測(cè)試,這個(gè)同步調(diào)用將導(dǎo)致性能從每秒上千次的請(qǐng)求降至只有幾十個(gè)。

2.關(guān)閉套接字池

Node.js的http客戶端會(huì)自動(dòng)地使用套接字池:默認(rèn)地,它會(huì)限制每臺(tái)主機(jī)只能有5個(gè)套接字。雖然套接字的重復(fù)使用可能會(huì)讓資源的增加在控制之下,但如果你需要處理許多數(shù)據(jù)來(lái)自于同一主機(jī)的并發(fā)請(qǐng)求時(shí),將會(huì)導(dǎo)致一系列的瓶頸。在這種情況下,增大maxSockets 的值或關(guān)閉套接字池是個(gè)好主意:

// Disable socket pooling
 
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

3.不要讓靜態(tài)資源使用Node.js

對(duì)于css和圖片等靜態(tài)資源,用標(biāo)準(zhǔn)的WebServer而不是Node.js。例如,領(lǐng)英移動(dòng)使用的是nginx。我們同時(shí)還利用內(nèi)容傳遞網(wǎng)絡(luò)(CDNs),它能將世界范圍內(nèi)的靜態(tài)資拷貝到服務(wù)器上。這有兩個(gè)好處:(1)能減少我們node.js服務(wù)器的負(fù)載量(2)CDNs可以讓靜態(tài)內(nèi)容在離用戶較近的服務(wù)器上傳遞,以此來(lái)減少等待時(shí)間。

4.在客戶端渲染

讓我們快速比較一下服務(wù)器渲染和客戶端渲染的區(qū)別。如果我們用node.js在服務(wù)器端渲染,對(duì)于每個(gè)請(qǐng)求我們都會(huì)回送像下面這樣的HTML頁(yè)面:

<!-- An example of a simple webpage rendered entirely server side -->
 
<!DOCTYPE html>
<html>
 <head>
  <title>LinkedIn Mobile</title>
 </head>
 <body>
  <div class="header">
   <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
  </div>
  <div class="body">
   Hello John!
  </div>
 </body>
</html>

請(qǐng)注意觀察這個(gè)頁(yè)面所有的內(nèi)容,除了用戶的名字,其余都是靜態(tài)內(nèi)容:對(duì)于每個(gè)用戶和頁(yè)面重載內(nèi)容都是一樣的。因此更有效的作法是讓Node.js僅以JSON形式返回頁(yè)面需要的動(dòng)態(tài)內(nèi)容。

{"name": "John"}
頁(yè)面的其余部分—所有靜態(tài)的HTML標(biāo)記-能放在JavaScript模板中(比如underscore.js模板):

<!-- An example of a JavaScript template that can be rendered client side -->
 
<!DOCTYPE html>
<html>
 <head>
  <title>LinkedIn Mobile</title>
 </head>
 <body>
  <div class="header">
   <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
  </div>
  <div class="body">
   Hello <%= name %>!
  </div>
 </body>
</html>

性能的提升來(lái)自于這些地方:如第三點(diǎn)所說(shuō),靜態(tài)JavaScript模板能通過(guò)webserver(比如nginx)在服務(wù)器端提供,或者用更好的CDN來(lái)實(shí)現(xiàn)。此外,JavaScript模板能緩存在瀏覽器中或存儲(chǔ)在本地,所有初始頁(yè)面加載以后,唯一需要發(fā)送給客戶端的數(shù)據(jù)就是JSON,這將是最有效果的。這個(gè)方法能極大性地減少CPU,IO,和Node.js的負(fù)載量。

5.使用gzip

許多服務(wù)器和客戶端支持gzip來(lái)壓縮請(qǐng)求和應(yīng)答。無(wú)論是應(yīng)答客戶端還是向遠(yuǎn)程服務(wù)器發(fā)送請(qǐng)求,請(qǐng)確保充分使用它。

6.并行化

試著讓你所有的阻塞操作-向遠(yuǎn)程服務(wù)發(fā)送請(qǐng)求,DB調(diào)用,文件系統(tǒng)訪問(wèn)并行化。這將能減少最慢的阻塞操作的等待時(shí)間,而不是所有阻塞操作的等待時(shí)間。為了保持回調(diào)和錯(cuò)誤處理的干凈,我們使用Step來(lái)控制流量。

7.Session自由化

領(lǐng)英移動(dòng)使用Express框架來(lái)管理請(qǐng)求/應(yīng)答周期。許多express的例子都包含如下的配置:

app.use(express.session({ secret: "keyboard cat" }));
默認(rèn)地,session數(shù)據(jù)是存儲(chǔ)在內(nèi)存中的,這會(huì)給服務(wù)器增加巨大的開(kāi)銷,特別是隨著用戶量的增長(zhǎng)。你可以使用一個(gè)外部session存儲(chǔ),比如MongoDB或Redis,不過(guò)每一個(gè)請(qǐng)求將會(huì)導(dǎo)致遠(yuǎn)程調(diào)用來(lái)取得session數(shù)據(jù)的開(kāi)銷。在可能的情況下,最好的選擇就是在服務(wù)器端存儲(chǔ)所有的無(wú)狀態(tài)數(shù)據(jù)。通過(guò)不包含上述express配置讓session自由化,你會(huì)看到更好的性能。

8.使用二進(jìn)制模塊

如果可能,用二進(jìn)制模塊取代JavaScript模塊。例如,當(dāng)我們從用JavaScript寫的SHA模塊轉(zhuǎn)換到Node.js的編譯版本,我們會(huì)看到性能的一個(gè)大躍進(jìn):

// Use built in or binary modules
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");

9.用標(biāo)準(zhǔn)的 V8 JavaScript 取代客戶端庫(kù)

許多JavaScript庫(kù)都是為了在web瀏覽器上使用而創(chuàng)建的,因?yàn)樵贘avaScript環(huán)境不同時(shí):比如,一些瀏覽器支持forEach,map和reduce這樣的函數(shù),但有些瀏覽器不支持。因此客戶端庫(kù)通常用許多低效的代碼來(lái)克服瀏覽器的差異。另一方面,在Node.js中,你能確切地知道哪些JavaScript方法是有效的:V8 JavaScript引擎支撐Node.js實(shí)現(xiàn)ECMA-262第五版中指定的ECMAScript。直接用標(biāo)準(zhǔn)的V8 JavaScript函數(shù)替代客戶端庫(kù),你會(huì)發(fā)現(xiàn)性能得到顯著的提高。

10.讓你的代碼保持小且輕

使用移動(dòng)設(shè)備會(huì)讓訪問(wèn)速度慢且延遲高,這告訴我們要讓我們的代碼保持小且輕。對(duì)于服務(wù)器代碼也保持同樣的理念。偶爾回頭看看你的決定且問(wèn)自己像這樣的問(wèn)題:“我們真的需要這個(gè)模塊嗎?”,“我們?yōu)槭裁从眠@個(gè)框架,它的開(kāi)銷值得我們使用嗎?”,“我們能用簡(jiǎn)便的方法實(shí)現(xiàn)它嗎?”。小輕且的代碼通常更高效、快速。

試試看

我們很努力地讓自己的移動(dòng)應(yīng)用變得快速。在IPhone應(yīng)用,Android應(yīng)用和HTML5移動(dòng)版本這些平臺(tái)上嘗試一下,讓我們知道自己做得怎么樣。

相關(guān)文章

  • Node.js 實(shí)現(xiàn)遠(yuǎn)程桌面監(jiān)控的方法步驟

    Node.js 實(shí)現(xiàn)遠(yuǎn)程桌面監(jiān)控的方法步驟

    這篇文章主要介紹了Node.js 實(shí)現(xiàn)遠(yuǎn)程桌面監(jiān)控的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • node.js中的http.createServer方法使用說(shuō)明

    node.js中的http.createServer方法使用說(shuō)明

    這篇文章主要介紹了node.js中的http.createServer方法使用說(shuō)明,本文介紹了http.createServer的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 用Nodejs實(shí)現(xiàn)在終端中炒股的實(shí)現(xiàn)

    用Nodejs實(shí)現(xiàn)在終端中炒股的實(shí)現(xiàn)

    這篇文章主要介紹了用Nodejs實(shí)現(xiàn)在終端中炒股的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Nodejs實(shí)現(xiàn)微信分賬的示例代碼

    Nodejs實(shí)現(xiàn)微信分賬的示例代碼

    這篇文章主要介紹了Nodejs實(shí)現(xiàn)微信分賬的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 如何降低node版本,怎樣實(shí)現(xiàn)降低node版本

    如何降低node版本,怎樣實(shí)現(xiàn)降低node版本

    這篇文章主要介紹了如何降低node版本,怎樣降低node版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • node.js實(shí)現(xiàn)上傳文件功能

    node.js實(shí)現(xiàn)上傳文件功能

    這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • koa-router源碼學(xué)習(xí)小結(jié)

    koa-router源碼學(xué)習(xí)小結(jié)

    這篇文章主要介紹了koa-router源碼學(xué)習(xí)小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • nodejs爬蟲初試superagent和cheerio

    nodejs爬蟲初試superagent和cheerio

    這篇文章主要介紹了nodejs爬蟲初試superagent和cheerio的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • node跨域請(qǐng)求方法小結(jié)

    node跨域請(qǐng)求方法小結(jié)

    本篇文章主要介紹了node跨域請(qǐng)求方法小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • nodejs版本過(guò)高導(dǎo)致vue-cli項(xiàng)目無(wú)法正常運(yùn)行的幾種解決方案

    nodejs版本過(guò)高導(dǎo)致vue-cli項(xiàng)目無(wú)法正常運(yùn)行的幾種解決方案

    這篇文章主要給大家介紹了關(guān)于nodejs版本過(guò)高導(dǎo)致vue-cli項(xiàng)目無(wú)法正常運(yùn)行的幾種解決方案,在項(xiàng)目中你可能需要用到的node版本太低,但是你所下的node版本是最新的,這時(shí)候就會(huì)報(bào)錯(cuò),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

江西省| 西充县| 濮阳市| 定襄县| 惠来县| 开原市| 奉化市| 神农架林区| 柘荣县| 来安县| 儋州市| 西畴县| 无极县| 靖边县| 思茅市| 忻城县| 铁岭县| 莱芜市| 阿荣旗| 武城县| 攀枝花市| 长治市| 佳木斯市| 余江县| 满城县| 鹰潭市| 金川县| 日土县| 饶平县| 山西省| 天镇县| 崇州市| 荔浦县| 崇义县| 得荣县| 洪洞县| 信阳市| 修水县| 滕州市| 永宁县| 厦门市|