首頁 web前端 js教程 你所未知的3種Node.js程式碼優化方式_node.js

你所未知的3種Node.js程式碼優化方式_node.js

May 16, 2016 pm 03:13 PM
node.js 程式碼最佳化

Node.js 程式的運作可能會受 CPU 或輸入輸出作業的限製而十分緩慢。從 CPU 角度來看,程式運作緩慢的典型原因之一就是未經最佳化的「熱點路徑」(一段經常被存取的程式碼)。從輸入輸出角度來看,程式運行速度的限制可能是受底層作業系統影響,也可能是出於 Node 本身的故障。更或者,一個運作緩慢的程式可能跟 Node 本身沒有任何關係,問題在於外部資源,例如資料庫查詢或 API 呼叫緩慢,未經過最佳化處理。

在本文中,我們將重點放在識別並優化程式碼庫中會導致 CPU 繁重運作的操作。同時,將探討生產應用的配置文件,分析並做出可提高運作效率的改變。

由於 Node 的單執行緒性質,避免繁重的 CPU 負載對伺服器來說尤其重要。因為在 CPU 上消耗的時間會佔用回應其他請求的時間。如果你注意到自己的應用程式回應速度緩慢,而且 CPU 在這個過程中始終佔用率較高,分析你的程式有助於找出瓶頸,並且使程式恢復快速運行的狀態。

分析應用
複製生產環境中出現的緩慢程序問題非常難解決,而且十分耗時。值得慶幸的是,你不需要親自做這些了。你可以在生產伺服器上收集設定檔數據,然後離線分析。下面讓我們來看看幾種分析方法。

1、使用核心級工具
首先,你可以使用核心級工具,例如 DTrace(Solaris, BSD),perf(Linux),或 XPerf(Windows),從運行的進程中收集堆疊追蹤信息,然後產生火焰圖。核心級分析對運行中的進程影響最小。火焰圖是根據呼叫堆疊產生的支援放大縮小查看的向量圖形。來自 Netflix 公司的 Yunong Xiao 針對 Linux 系統中 perf,發表過超讚的演講和推文,幫助你加深對該技術的了解。如果你想在生產程式中保持高吞吐量,可以參考使用這種方法。

2、

2、使用 V8 分析器
另一個選項是直接使用 V8 分析器。這種方式會與程式共用進程,因此它會影響程式效能。基於這個原因,請只在你遇到這類問題時執行 V8 分析器來捕捉相關輸出。此方法的優點是:你可以使用 Chrome 的所有分析工具,結合其輸出結果(包括火焰圖),對程式進行調查。

請執行以下程式碼來測試你的程式:

npm install v8-profiler --save
登入後複製

之後,在你的程式中加入以下程式碼:

const profiler = require('v8-profiler')
const fs = require('fs')
var profilerRunning = false
function toggleProfiling () {
 if (profilerRunning) {
  const profile = profiler.stopProfiling()
  console.log('stopped profiling')
  profile.export()
   .pipe(fs.createWriteStream('./myapp-'+Date.now()+'.cpuprofile'))
   .once('error', profiler.deleteAllProfiles)
   .once('finish', profiler.deleteAllProfiles)
  profilerRunning = false
  return
 }
 profiler.startProfiling()
 profilerRunning = true
 console.log('started profiling')
}
process.on('SIGUSR2', toggleProfiling)
登入後複製

只要你發送 SIGUSR2 訊號到此進程,它就會開始分析。再次發送一個 SIGUSR2 訊號可以停止分析(程式碼如下)。

kill -SIGUSR2 [pid]
登入後複製

該進程的分析結果將寫入到目前工作路徑的檔案中(請確保該路徑可被寫入)。由於這是一個可編程接口,你可以隨意觸發它(使用 web endpoint,IPC,等等)。如果你對程式在何時變得緩慢有預感,你可以在任一時期觸發該介面。建立自動觸發對避免持續監看程序是非常有用的,但是它要求你對捕獲時間以及捕獲時長有預測性認知。

一旦已經收集好設定檔數據,將它載入到Chrome開發工具中,開始分析吧!

3、使用進程管理器
儘管直接使用 V8 分析器是非常有效且可自訂的,但是它會進入你的程式碼庫,並且會向專案添加另一個你可能不想要的依賴性條件。一種替代方式就是使用進程管理器,它可以在你需要分析時,用各種工具將你的程式包裝起來。一種可選的工具是來自 StrongLoop 的 SLC 命令列工具。

首先,執行npm install strongloop –g,然後執行以下程式碼:

slc start [/path/to/app]
登入後複製

上述程式碼會在進程管理器中啟動你的程序,你可以按需提取 CPU 分析資料。要驗證並獲取應用程式 id,請運行:

slc ctl
登入後複製

你將得到與下面類似的運行結果:

Service ID: 1
Service Name: my-sluggish-app
Environment variables:
  Name   Value
  NODE_ENV production
Instances:
  Version Agent version Debugger version Cluster size Driver metadata
   5.0.1    2.0.2      1.0.0       1       N/A
Processes:
    ID   PID  WID Listening Ports Tracking objects? CPU profiling? Tracing? Debugging?
  1.1.61022 61022  0
  1.1.61023 61023  1   0.0.0.0:3000
登入後複製

定位應用的進程 id。在此例中,id 為1.1.61023。現在我們就能在任何時間開始分析了,運行如下程式碼即可:

slc ctl cpu-start 1.1.61023
登入後複製

当我们觉得已经捕获到了迟滞行为,就可以运行以下代码来停止分析器:

slc ctl cpu-stop 1.1.61023
登入後複製

以下代码将写文件至硬盘:

CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools
登入後複製

好啦,就是这样。你可以像在 V8 分析器里那样把文件加载到 Chrome 里面进一步分析。

作出正确决定
在本文中,笔者展示了三种在 Node 中捕获生产环境下 CPU 使用量的方式。那么,你应该选用哪一种呢?下面是一些帮助你缩小决策范围的想法:

  • 我需要分析很长一段时间:使用内核级工具。
  • 我想用 Chrome 开发工具:使用 V8 分析器或者过程管理器。
  • 我想捕获应用中的特定行为:使用 V8 分析器。
  • 我不想影响到程序性能:使用内核级程序
  • 我希望我不用挨个测试文件来获取程序分析信息:使用过程管理器

以上就是本文的全部内容,3种Node.js代码优化方式,希望大家可以熟练掌握。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

這篇文章帶大家深入了解NodeJS V8引擎的記憶體和垃圾回收器(GC),希望對大家有幫助!

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

一起聊聊Node中的事件循環 一起聊聊Node中的事件循環 Apr 11, 2023 pm 07:08 PM

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

深入了解Node中的Buffer 深入了解Node中的Buffer Apr 25, 2023 pm 07:49 PM

一開始的時候 JS 只在瀏覽器端運行,對於 Unicode 編碼的字串容易處理,但對於二進位和非 Unicode 編碼的字串處理困難。並且二進制是電腦最底層的資料格式,視訊/音訊/程式/網路包

如何做好Java程式碼的重構 如何做好Java程式碼的重構 Jun 15, 2023 pm 09:17 PM

作為世界上最受歡迎的程式語言之一,Java已成為許多企業和開發者的首選語言。然而,程式碼的重構對於保持程式碼品質以及開發效率至關重要。 Java程式碼由於其複雜性,隨著時間的推移可能會變得越來越難以維護。本文將討論如何進行Java程式碼的重構,以提高程式碼品質和可維護性。了解重構的原則Java程式碼重構的目的在於改進程式碼的結構、可讀性和可維護性,而不是簡單的「改變程式碼」。因

一文聊聊如何高效率開發表現層Node.js應用 一文聊聊如何高效率開發表現層Node.js應用 Apr 17, 2023 pm 07:02 PM

如何使用 Node.js 進行前端應用的開發?以下這篇文章為大家介紹一下Node開發前端應用的方法,涉及到表現層應用的開發。我今天分享的方案是針對簡單場景的,旨在讓前端開發人員不必掌握太多關於 Node.js 的背景知識和專業知識,即使沒有程式碼編寫經驗,也能完成一些簡單的服務端開發任務。

什麼是EventLoop?怎麼測試Node或頁面的效能 什麼是EventLoop?怎麼測試Node或頁面的效能 Mar 03, 2023 pm 07:47 PM

Event Loop 機制大家應該都有了解。本文利用 EventLoop 去做一個有趣的檢測node或頁面效能的程式碼,順便介紹了一下EventLoop,希望對大家有幫助!

See all articles