搜尋
首頁web前端js教程你所未知的3種Node.js程式碼優化方式_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
JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

在Quartz中如何在任務開始前發送通知?在Quartz中如何在任務開始前發送通知?Apr 04, 2025 pm 09:24 PM

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中,如何在構造函數中獲取原型鏈上函數的參數?在JavaScript中,如何在構造函數中獲取原型鏈上函數的參數?Apr 04, 2025 pm 09:21 PM

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

微信小程序webview中Vue.js動態style位移失效是什麼原因?微信小程序webview中Vue.js動態style位移失效是什麼原因?Apr 04, 2025 pm 09:18 PM

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何實現對多個鏈接的並發GET請求並依次判斷返回結果?在Tampermonkey中如何實現對多個鏈接的並發GET請求並依次判斷返回結果?Apr 04, 2025 pm 09:15 PM

在Tampermonkey中如何對多個鏈接進行並發GET請求並依次判斷返回結果?在Tampermonkey腳本中,我們經常需要對多個鏈...

See all articles

熱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.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。