亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

nodejs的10個性能優化技巧

2019-11-20 14:21:17
字體:
來源:轉載
供稿:網友

下面是我們使用Node.js時遵循的10個性能規則:

1. 避免使用同步代碼

在設計上,Node.js是單線程的。為了能讓一個單線程處理許多并發的請求,你可以永遠不要讓線程等待阻塞,同步或長時間運行的操作。Node.js的一個顯著特征是:它從上到下的設計和實現都是為了實現異步。這讓它非常適合用于事件型程序。

不幸的是,還是有可能會發生同步/阻塞的調用。例如,許多文件系統操作同時擁有同步和異步的版本,比如writeFile和writeFileSync。即使你用代碼來控制同步方法,但還是有可能不注意地用到阻塞調用的外部函數庫。當你這么做時,對性能的影響是極大的。

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

我們的初始化log在實現時無意地包含了一個同步調用來將內容寫入磁盤。如果我們不做性能測試那么就會很容易忽略這個問題。當以developer box中一個node.js實例來作為標準測試,這個同步調用將導致性能從每秒上千次的請求降至只有幾十個。

2.關閉套接字池

Node.js的http客戶端會自動地使用套接字池:默認地,它會限制每臺主機只能有5個套接字。雖然套接字的重復使用可能會讓資源的增加在控制之下,但如果你需要處理許多數據來自于同一主機的并發請求時,將會導致一系列的瓶頸。在這種情況下,增大maxSockets 的值或關閉套接字池是個好主意:

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

3.不要讓靜態資源使用Node.js

對于css和圖片等靜態資源,用標準的WebServer而不是Node.js。例如,領英移動使用的是nginx。我們同時還利用內容傳遞網絡(CDNs),它能將世界范圍內的靜態資拷貝到服務器上。這有兩個好處:(1)能減少我們node.js服務器的負載量(2)CDNs可以讓靜態內容在離用戶較近的服務器上傳遞,以此來減少等待時間。

4.在客戶端渲染

讓我們快速比較一下服務器渲染和客戶端渲染的區別。如果我們用node.js在服務器端渲染,對于每個請求我們都會回送像下面這樣的HTML頁面:

<!-- 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>

請注意觀察這個頁面所有的內容,除了用戶的名字,其余都是靜態內容:對于每個用戶和頁面重載內容都是一樣的。因此更有效的作法是讓Node.js僅以JSON形式返回頁面需要的動態內容。

{"name": "John"}
頁面的其余部分―所有靜態的HTML標記-能放在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>

性能的提升來自于這些地方:如第三點所說,靜態JavaScript模板能通過webserver(比如nginx)在服務器端提供,或者用更好的CDN來實現。此外,JavaScript模板能緩存在瀏覽器中或存儲在本地,所有初始頁面加載以后,唯一需要發送給客戶端的數據就是JSON,這將是最有效果的。這個方法能極大性地減少CPU,IO,和Node.js的負載量。

5.使用gzip

許多服務器和客戶端支持gzip來壓縮請求和應答。無論是應答客戶端還是向遠程服務器發送請求,請確保充分使用它。

6.并行化

試著讓你所有的阻塞操作-向遠程服務發送請求,DB調用,文件系統訪問并行化。這將能減少最慢的阻塞操作的等待時間,而不是所有阻塞操作的等待時間。為了保持回調和錯誤處理的干凈,我們使用Step來控制流量。

7.Session自由化

領英移動使用Express框架來管理請求/應答周期。許多express的例子都包含如下的配置:

app.use(express.session({ secret: "keyboard cat" }));
默認地,session數據是存儲在內存中的,這會給服務器增加巨大的開銷,特別是隨著用戶量的增長。你可以使用一個外部session存儲,比如MongoDB或Redis,不過每一個請求將會導致遠程調用來取得session數據的開銷。在可能的情況下,最好的選擇就是在服務器端存儲所有的無狀態數據。通過不包含上述express配置讓session自由化,你會看到更好的性能。

8.使用二進制模塊

如果可能,用二進制模塊取代JavaScript模塊。例如,當我們從用JavaScript寫的SHA模塊轉換到Node.js的編譯版本,我們會看到性能的一個大躍進:

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

9.用標準的 V8 JavaScript 取代客戶端庫

許多JavaScript庫都是為了在web瀏覽器上使用而創建的,因為在JavaScript環境不同時:比如,一些瀏覽器支持forEach,map和reduce這樣的函數,但有些瀏覽器不支持。因此客戶端庫通常用許多低效的代碼來克服瀏覽器的差異。另一方面,在Node.js中,你能確切地知道哪些JavaScript方法是有效的:V8 JavaScript引擎支撐Node.js實現ECMA-262第五版中指定的ECMAScript。直接用標準的V8 JavaScript函數替代客戶端庫,你會發現性能得到顯著的提高。

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

使用移動設備會讓訪問速度慢且延遲高,這告訴我們要讓我們的代碼保持小且輕。對于服務器代碼也保持同樣的理念。偶爾回頭看看你的決定且問自己像這樣的問題:“我們真的需要這個模塊嗎?”,“我們為什么用這個框架,它的開銷值得我們使用嗎?”,“我們能用簡便的方法實現它嗎?”。小輕且的代碼通常更高效、快速。

試試看

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久视频免费观看| 国产精品27p| 韩国日本不卡在线| 欧美片一区二区三区| 51午夜精品视频| 国产精品嫩草视频| 91视频免费网站| 亚洲综合成人婷婷小说| 日韩在线观看免费网站| 日韩在线视频一区| 久久免费精品日本久久中文字幕| 高潮白浆女日韩av免费看| 成人写真视频福利网| 国产精品久久久久久久久久| 国产亚洲精品激情久久| 亚洲变态欧美另类捆绑| 日韩中文在线视频| 色偷偷av一区二区三区| 亚洲性av在线| 成人午夜激情免费视频| 国产精品人成电影在线观看| 亚洲999一在线观看www| 午夜精品99久久免费| 国产一区二区三区三区在线观看| 欧美激情精品久久久久久大尺度| 国产精品美女www爽爽爽视频| 亚洲爱爱爱爱爱| 日韩精品免费在线视频| 欧美亚洲视频在线看网址| 色婷婷综合成人av| 国产脚交av在线一区二区| 中文字幕亚洲综合| 成人动漫网站在线观看| 欧美大片在线看免费观看| 国产精品视频网站| 久久成人av网站| 久久精品国产亚洲| 成人在线观看视频网站| 美日韩精品免费观看视频| 中文国产成人精品| 韩国一区二区电影| 久久综合九色九九| 国产亚洲精品激情久久| 57pao成人永久免费视频| 国产精品福利片| 有码中文亚洲精品| 亚洲国产中文字幕久久网| 成人在线小视频| 欧美久久精品午夜青青大伊人| www.国产精品一二区| 亚洲视频在线观看视频| 欧美日韩免费在线| 国产一区二区三区视频免费| 国产美女久久久| 日产日韩在线亚洲欧美| 国产美女精品免费电影| 欧美激情videoshd| 日韩hd视频在线观看| 欧美激情乱人伦| 欧美一性一乱一交一视频| 欧美性做爰毛片| 国产精品自拍小视频| 国产精品嫩草视频| 成人在线播放av| 亚洲最大福利网站| 日韩av综合中文字幕| 国产精品视频地址| 国产精品久久久久免费a∨大胸| 久久久久久久久久久免费| 欧美性猛交xxx| 国产成人精品免高潮在线观看| 国产91在线播放九色快色| 精品国产鲁一鲁一区二区张丽| 国产一区二区三区久久精品| 爽爽爽爽爽爽爽成人免费观看| 精品色蜜蜜精品视频在线观看| 97精品免费视频| 国产偷国产偷亚洲清高网站| 亚洲国产免费av| 亚洲欧美另类自拍| 97国产在线观看| 久久人人爽人人爽爽久久| 国产精品 欧美在线| 久久久在线观看| 精品国产一区二区三区久久| 中文字幕亚洲无线码a| 色在人av网站天堂精品| 欧美日韩一区二区免费在线观看| 亚洲精品一区中文| 亚洲最大av网站| 亚洲福利在线看| 国产日韩精品电影| 少妇高潮 亚洲精品| 国产精品69久久久久| 中文字幕亚洲无线码a| 亚洲欧美日韩久久久久久| 91精品视频在线播放| 久久久久久久97| 国产91精品久| 欧美日韩国产黄| 国产91av在线| 色偷偷亚洲男人天堂| 国产va免费精品高清在线观看| 国产日韩av高清| 色综合久久精品亚洲国产| 日韩经典第一页| 91精品久久久久| 国产日产久久高清欧美一区| 成人国产亚洲精品a区天堂华泰| 欧美国产日本高清在线| 亚洲图片在区色| 久久精品视频中文字幕| 日韩美女在线观看| 国产精品爽爽ⅴa在线观看| 神马久久久久久| 国产亚洲精品久久久优势| 成人免费观看49www在线观看| 久久在线精品视频| 欧美第一黄网免费网站| 2019最新中文字幕| 国产丝袜一区二区| 欧美激情国产精品| 成人激情免费在线| 欧美电影在线观看| 日韩欧美aaa| 精品一区二区三区四区在线| www.日韩系列| 久久国产精品久久久久久| 日韩免费看的电影电视剧大全| 亚洲欧美日韩精品久久| 中文字幕亚洲欧美在线| 波霸ol色综合久久| 成人午夜在线视频一区| www.xxxx精品| 亚洲影院高清在线| 亚洲自拍偷拍视频| 成人黄色av网| 日韩在线视频观看正片免费网站| 日韩视频免费在线观看| 久久免费视频在线| 欧美在线精品免播放器视频| 啪一啪鲁一鲁2019在线视频| 亚洲新声在线观看| 一区二区三区视频免费在线观看| 欧美日韩一区二区免费在线观看| 成人在线观看视频网站| 国产mv久久久| 九九综合九九综合| 亚洲深夜福利视频| 欧美精品videossex性护士| 欧美巨乳在线观看| 一本色道久久综合狠狠躁篇的优点| 国产精品美女久久久久久免费| 亚洲欧美另类自拍| 91在线视频九色| 日韩av在线导航| 97视频免费看| 亚洲xxxx视频| 欧美精品一本久久男人的天堂| 国产精品日韩精品| 日韩美女av在线| 日韩一区二区在线视频| 国产欧美精品日韩精品| 亚洲一区二区三区777|