幾個月前,我們發布了 Encore.ts — TypeScript 的開源後端框架。
由於已經有很多框架,我們想分享我們所做的一些異常設計決策以及它們如何帶來卓越的效能數據。
我們最近發布的效能基準顯示,Encore.ts 的請求吞吐量是 Express.js 的 9 倍,是 Fastify 的 2 倍。
今天,我們將繼續我們的效能之旅,深入探討 Encore.ts 如何實現令人難以置信的快速冷啟動啟動時間。
性能基準
這次我們對 Encore.ts、Fastify、NestJS 和 Express 進行了基準測試,以了解每個框架在冷啟動時的表現。
基準測試程式註冊了 10 個 API 端點,每個端點都有一個簡單的模式,並設定模式驗證。
對於模式驗證,我們盡可能使用 Zod。
就 Fastify 而言,我們使用 Ajv 作為官方支援的模式驗證庫。
我們測量了從 JavaScript 程式碼開始執行到伺服器準備好接受傳入請求的時間。
對於每個基準測試,我們選取五次運行中的最佳結果。
廢話不多說了,讓我們深入研究一下數字吧!
Encore.ts 冷啟動比 NestJS 和 Fastify 快 17 倍
(查看 GitHub 上的基準程式碼。)
如您所見,Encore.ts 實現了驚人的快速冷啟動時間,比 Express 快 5 倍以上,比 NestJS 快 17 倍以上。
這怎麼可能?透過我們的測試,我們確定了性能的兩個主要來源,都與 Encore.ts 的底層工作方式有關。
但在我們開始之前,我們先來談談冷啟動到底是什麼,以及為什麼它們重要。
什麼是冷啟動?
在無伺服器環境中,冷啟動是指底層平台首先需要啟動伺服器的新實例以服務傳入請求。 (它也可以指第一次啟動伺服器的新實例來處理請求,例如在部署之後。)
由於請求實際上處於擱置狀態,直到進程啟動並準備好處理請求為止,因此減少冷啟動時間會對應用程式的長尾延遲產生很大影響。
這對於擁有多個無伺服器功能的分散式系統尤其重要,因為在處理請求時,您更有可能在系統的某些部分遇到冷啟動。
冷啟動的剖析
冷啟動期間發生的具體情況在一定程度上取決於您要部署到的平台(Kubernetes、Lambda、Cloud Run 等)。
但總的來說,這個過程看起來像這樣:
- 平台下載無伺服器功能的程式碼/容器鏡像
- 平台啟動容器/無伺服器函數/容器的新實例
- 容器/函數初始化自身(導入 JavaScript 模組, 運行初始化程式碼等)
完成這些初始化步驟後,冷啟動完成,無伺服器函數開始處理傳入請求。
前兩個步驟很大程度上是我們無法控制的(除了確保程式碼/容器的大小已最佳化),所以讓我們將注意力集中在第三步上。
事實上,讓我們進一步分解第三步,假設我們正在執行 Node.js:
- 節點進程啟動並開始初始化V8 JavaScript引擎
- 入口點檔案被解析、載入並開始執行應用程式程式碼
- 當 JavaScript 程式碼執行 import 和 require 語句時,更多的檔案會被載入、解析和執行。 (對於具有大量依賴項的應用程序,請重複多次。)
最後,在載入所有依賴項並執行所有初始化程式碼後,容器/無伺服器函數已準備好處理傳入請求。
優化冷啟動
上面的細分為我們提供了明確的最佳化目標,Encore.ts 大力優化了它控制的所有步驟。
優化1:Rust運行時
Encore.ts 在 Rust 中實作並作為本機模組載入到 Node.JS 中。這對於冷啟動有幾個好處:
需要解析和執行的 JavaScript 更少。由於 JavaScript 是一種解釋性語言,因此所有 JavaScript 程式碼都需要從磁碟讀取、解析和執行。 Encore.ts 作為預先編譯的原生模組,載入速度極快,不需要 JavaScript 引擎(V8)解析或執行。
零 NPM 依賴。由於 Encore.ts 使用 Rust 實現其所有功能,因此它沒有任何 NPM 依賴項,這進一步減少了冷啟動期間需要執行的 JavaScript 數量。
預編譯與最佳化。 JavaScript 嚴重依賴即時編譯 (JIT),其中重複執行的程式碼會被 JavaScript 引擎最佳化。這對於解釋型語言來說很有意義,但這也意味著第一次執行一段程式碼時執行速度會相當慢,這會顯著影響冷啟動。由於 Encore.ts 是用 Rust 實現的,因此它是預先編譯的,並針對其運行的平台進行了大量最佳化,這意味著它從第一次執行起就很快。
優化2:高效的Docker映像
Encore.ts 預設會建立縮小的 Docker 映像,僅包含轉譯的 JavaScript 和執行應用程式所需的依賴項。這減少了套件的大小,從而減少了下載和啟動容器所需的時間。
此外,一些計算平台還添加了對流式 Docker 映像的支持,這意味著該平台可以在下載整個映像之前啟動容器。 Encore.ts 對此有內建支持,並自動優先考慮影像中需要減少冷啟動的部分。
總結
透過將 Rust 運行時與優化的 Docker 映像相結合,Encore.ts 能夠實現顯著的冷啟動時間,這會對應用程式的長尾延遲產生很大影響。
如果效能對您的專案很重要,嘗試 Encore.ts 可能是個好主意。
而且它都是開源的,因此您可以查看程式碼並在 GitHub 上做出貢獻。
或嘗試一下,讓我們知道您的想法!
以上是Encore.ts — 比 NestJS 和 Fastify 更快的冷啟動的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

WebStorm Mac版
好用的JavaScript開發工具