Categories
程式開發

JavaScript 執行效率不行?因為你還沒用 V8 | 極客時間


我是李兵,現在是一名創業者,也是一位工程師。

去年,我寫了一個專欄《瀏覽器工作原理與實踐》,其中提到了 V8 是如何執行 JavaScript 代碼的。我發現,不少朋友都對 V8 很感興趣,對這部分的學習意猶未盡,因此,今天我來跟你深入聊聊 V8。

V8 是 Google 開源的 JavaScript 引擎。全球超過 25 億台安卓設備都在使用 Chrome 瀏覽器,所以我們寫的 JavaScript 應用,大都跑在 V8 上。作為當下使用最廣泛的 JavaScript 引擎,V8 的生態圈也非常龐大,這與它革命性的設計密不可分。

在V8 出現之前,所有JavaScript 引擎用的都是解釋執行的方式,這是JavaScript 執行速度過慢的主要原因;而V8 率先引入即時編譯(JIT)的雙輪驅動設計,混合編譯執行和解釋執行兩種手段,為JavaScript 的執行速度帶來了極大提升。

V8 出現後,各大廠商也紛紛在 JavaScript 虛擬機中引入了 JIT 機制。可以說,V8 的出現將 JavaScript 虛擬機技術推向了一個全新的高度。

但我發現,大部分人在運行 V8 時,只是單純使用 JavaScript 和調用 Web API,並不了解這個“黑盒”內部是如何工作的。一旦項目出現問題,很難找到有效的解決策略,比如:項目佔用內存過高,或頁面響應速度過慢,又或者使用 Node.js 時,任務被阻塞等等。只有熟悉 V8 的工作機制,才會有系統性的思路來解決這些問題。

所以,我推出了第二個專欄《圖解 Google V8》。在專欄中,我完整梳理了 V8 的核心知識體系,通過大量圖片演示,深入淺出地講解 V8 執行 JavaScript 代碼的底層機制和原理。

跟我學完這門課,你不僅可以了解完整的 V8 編譯流水線,還會搞懂 JavaScript 語言的核心特性,進而從根源上解決程序問題,加快 JavaScript 的執行速度。

我是誰?

我是李兵,《瀏覽器工作原理與實踐》專欄作者,前盛大創新院高級研究員,在瀏覽器和前端開發領域深耕了十餘年。曾在盛大創新院參與WebOS 項目,在順網科技帶領團隊打造了一款給全國網吧使用的“F1 瀏覽器”,目前致力於為企業提供前端項目諮詢和瀏覽器研發的基礎服務。

我是如何講解 Google V8 的?

剛剛我們提到過,V8 的主要職責是執行JavaScript 代碼。所以,首先我們要了解 JavaScript 的基本特性和設計思想。

JavaScript 是一門優秀的語言,借鑒了其他語言的優質特性,特別是“原型繼承機制”和“函數是一等公民”這兩個設計。
JavaScript 執行效率不行?因為你還沒用 V8 | 極客時間 1

△ JavaScript 的設計思想

與此同時,JavaScript 也是一門處處是「坑」的語言,比如:使用new 加構造函數來創建對象時,背後隱藏的很多細節,都會增大代碼的出錯概率;初期的JavaScript 沒有塊級作用域機制,需要採取變量提升策略,而變量提升又是非常反人性的設計,等等。

所以,我們在學習 V8 時,要格外關注 JavaScript 這些獨特的設計思想,及其特性背後的實現。

深入分析過 JavaScript 語言後,我們還要掌握 V8 執行 JavaScript 代碼的完整流程,也就是 V8 的編譯流水線,其完整流程如下圖:
JavaScript 執行效率不行?因為你還沒用 V8 | 極客時間 2

△ V8 的編譯流水線

編譯流水線本身並不復雜,但其中涉及很多技術,比如 JIT、延遲解析、隱藏類、內聯緩存等等,它們決定了一段 JavaScript 代碼能否正常執行,及其執行效率。

舉個例子,V8 使用的隱藏類(Hide Class) 可將 JavaScript 中的動態類型轉換為靜態,有效解決了動態類型語言的執行速度過慢問題。如果你熟悉 V8 的工作機制,就能充分利用好隱藏類這種強大的優化特性,寫出更加高效的代碼。

再比如,為了加快代碼的啟動速度,V8 實現了JavaScript 代碼的惰性解析。通過學習惰性解析機制,你可以優化代碼以更加適應這個機制,從而提高程序的性能。

最後,我們要了解 V8 另外兩個重要特性:事件循環系統垃圾回收機制。

事件循環系統與 JavaScript 中的難點——異步編程緊密相關。我們知道,JavaScript 是單線程的,如果同一時間發送了多個 JS 的執行請求,就要排隊,也就是異步編程。而 V8 的事件循環系統會調度這些排隊任務,保證 JavaScript 代碼被 V8 有序地執行。

因此可以說,事件循環系統是 V8 的心臟,驅動著 V8 持續工作。

另外,JavaScript 是一門自動垃圾回收的語言。 V8 在執行垃圾回收時,會佔用主線程資源,如果我們編寫的程序頻繁觸發垃圾回收,就會阻塞主線程。而在我們了解 V8 如何分配並回收內存數據後,就能打通整個鏈路,掌握系統排查問題的方法。

JavaScript 執行效率不行?因為你還沒用 V8 | 極客時間 3

△ 高清版圖譜的領取方式,請見文末

結合以上內容,我總結了一份 V8 高效學習路徑。通過這張圖譜,你可以對 V8 的知識體係有更加直觀的理解,同時明確每部分的核心知識點。

在專欄《圖解 Google V8》中,我也會按照這樣的思路講解,幫你構建完整系統的知識體系,徹底拿下 V8。
JavaScript 執行效率不行?因為你還沒用 V8 | 極客時間 4

現在訂閱,有什麼福利?

1.早鳥優惠 ¥55,原價 ¥68。結算時輸入優惠口令「googlev88」,優惠基礎上 再減 ¥5到手價 ¥50,僅限 「前 200 人」有效,戳此搶購>>>

2.訂閱專欄後,生成分享海報,每成功邀請 1 位好友訂閱,可得 ¥18 返現