改進程式碼快取
V8使用程式碼快取來快取常用腳本的生成程式碼。從Chrome 66開始,我們透過在頂層執行後生成快取,使更多的程式碼得以快取。這使初次載入時的解析及編譯時間減少了20–40%。
V8使用程式碼快取來快取常用腳本的生成程式碼。從Chrome 66開始,我們透過在頂層執行後生成快取,使更多的程式碼得以快取。這使初次載入時的解析及編譯時間減少了20–40%。
TL;DR: 自 Chrome 66 起,V8 在背景執行緒上編譯 JavaScript 原始碼,減少主執行緒上的編譯時間,對於典型網站來說降低了 5% 到 20%。
自版本 41 起,Chrome 支援透過 V8 的 StreamedSource
API 在背景執行緒上解析 JavaScript 原始檔案(新技術介紹)。這使得 V8 能夠在 Chrome 從網路下載檔案的第一部分後立即開始解析 JavaScript 原始碼,並在 Chrome 通過網路串流檔案時並行進行解析。透過此方式,V8 幾乎可以在檔案下載完成時完成 JavaScript 的解析,從而顯著提升加載速度。
在 Chrome 66 中調試記憶體洩漏變得更容易。Chrome 的 DevTools 現在可以追蹤並快照 C++ DOM 物件,並顯示所有從 JavaScript 可達的 DOM 物件及其引用。這項功能是新 V8 垃圾回收器的 C++ 追蹤機制的一項優勢。
程式碼覆蓋率提供有關應用程式中某些部分是否以及執行次數的資訊。它通常用來確定測試套件在多大程度上檢驗特定程式碼基礎。
作為一名 JavaScript 開發者,您可能經常會遇到可以使用程式碼覆蓋率的情境。例如:
console.log
進行 printf
-風格的除錯或手動逐步執行程式碼,程式碼覆蓋率可以顯示應用程式中哪些部分已被執行的即時資訊。V8 中的 JavaScript 物件分配在由 V8 的垃圾收集器管理的堆上。在之前的博客文章中,我們已經討論了如何減少垃圾收集暫停時間(多次)和記憶體消耗。在這篇博客文章中,我們介紹了平行 Scavenger,Orinoco,V8 主要併發和平行垃圾收集器的一項最新功能,並討論了我們在過程中實現的設計決策和替代方法。
注意: 如果您更喜歡觀看演示,而不是閱讀文章,請欣賞以下視頻!
JavaScript 對象可以具有任何與之關聯的任意屬性。對象屬性的名稱可以包含任意字符。JavaScript 引擎可以選擇優化的有趣案例之一就是屬性名稱是純數字的情況,特別是 陣列索引。
在這篇博客文章中,我們想解釋V8如何在內部處理JavaScript屬性。從JavaScript的角度看,屬性只需要少量的區分。JavaScript對象主要表現為字典形式,具有字符串鍵和任意對象作為值。不過,規範確實會在迭代過程中將整數索引的屬性與其他屬性區分開來。除此之外,無論是整數索引還是非整數索引的屬性,行為大致相同。
for
-in
是許多框架中廣泛使用的語言特性。儘管它的廣泛應用,從實現角度來看,它卻是較為晦澀的語言構造之一。V8 為了讓這個特性儘可能快付出了極大的努力。在過去的一年中,for
-in
在符合規範的同時變得最多快了三倍,這取決於使用的上下文。