跳至主要内容

38 篇文章 含有標籤「internals」

檢視所有標籤

改進程式碼快取

· 閱讀時間約 5 分鐘
Mythri Alle, 首席程式碼快取專家

V8使用程式碼快取來快取常用腳本的生成程式碼。從Chrome 66開始,我們透過在頂層執行後生成快取,使更多的程式碼得以快取。這使初次載入時的解析及編譯時間減少了20–40%。

背景編譯

· 閱讀時間約 5 分鐘
[Ross McIlroy](https://twitter.com/rossmcilroy),主執行緒捍衛者

TL;DR: 自 Chrome 66 起,V8 在背景執行緒上編譯 JavaScript 原始碼,減少主執行緒上的編譯時間,對於典型網站來說降低了 5% 到 20%。

背景

自版本 41 起,Chrome 支援透過 V8 的 StreamedSource API 在背景執行緒上解析 JavaScript 原始檔案(新技術介紹)。這使得 V8 能夠在 Chrome 從網路下載檔案的第一部分後立即開始解析 JavaScript 原始碼,並在 Chrome 通過網路串流檔案時並行進行解析。透過此方式,V8 幾乎可以在檔案下載完成時完成 JavaScript 的解析,從而顯著提升加載速度。

從 JavaScript 到 DOM 並回溯的追蹤

· 閱讀時間約 5 分鐘
Ulan Degenbaev、Alexei Filippov、Michael Lippautz 和 Hannes Payer —— DOM 的合作夥伴

在 Chrome 66 中調試記憶體洩漏變得更容易。Chrome 的 DevTools 現在可以追蹤並快照 C++ DOM 物件,並顯示所有從 JavaScript 可達的 DOM 物件及其引用。這項功能是新 V8 垃圾回收器的 C++ 追蹤機制的一項優勢。

延遲反序列化

· 閱讀時間約 7 分鐘
Jakob Gruber ([@schuay](https://twitter.com/schuay))

TL;DR: 延遲反序列化最近在 V8 v6.4 中默認啟用,平均減少每個瀏覽器標籤超過 500 KB 的 V8 記憶體使用量。繼續閱讀以了解更多!

介紹 V8 快照

但首先,讓我們退一步來看看 V8 如何使用堆快照來加速新 Isolate 的創建(大致對應於 Chrome 中的一個瀏覽器標籤)。我的同事 Yang Guo 在他關於自定義啟動快照的文章中給出了很好的介紹:

優化哈希表:隱藏哈希碼

· 閱讀時間約 6 分鐘
[Sathya Gunasekaran](https://twitter.com/_gsathya),哈希碼的守護者

ECMAScript 2015 引入了多種新的資料結構如 Map、Set、WeakSet 和 WeakMap,所有這些在底層都使用了哈希表。本文章詳細介紹了 最近的改進,即 V8 v6.3+ 如何在哈希表中存儲鍵。

JavaScript 程式碼覆蓋率

· 閱讀時間約 9 分鐘
Jakob Gruber ([@schuay](https://twitter.com/schuay))

程式碼覆蓋率提供有關應用程式中某些部分是否以及執行次數的資訊。它通常用來確定測試套件在多大程度上檢驗特定程式碼基礎。

為何有用?

作為一名 JavaScript 開發者,您可能經常會遇到可以使用程式碼覆蓋率的情境。例如:

  • 關心您的測試套件品質?正在重構一個大型舊專案?程式碼覆蓋率能準確告知程式碼基礎中的哪些部分被覆蓋。
  • 想快速知道程式碼基礎中特定部分是否被執行?與其使用 console.log 進行 printf-風格的除錯或手動逐步執行程式碼,程式碼覆蓋率可以顯示應用程式中哪些部分已被執行的即時資訊。
  • 或者您正在針對速度進行優化,並希望知道應該集中在哪些位置?執行計次可以指出熱點函式和迴圈。

Orinoco:年輕代垃圾收集

· 閱讀時間約 8 分鐘
Ulan Degenbaev、Michael Lippautz 和 Hannes Payer,[TSAN](https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual) 的朋友們

V8 中的 JavaScript 物件分配在由 V8 的垃圾收集器管理的堆上。在之前的博客文章中,我們已經討論了如何減少垃圾收集暫停時間多次)和記憶體消耗。在這篇博客文章中,我們介紹了平行 Scavenger,Orinoco,V8 主要併發和平行垃圾收集器的一項最新功能,並討論了我們在過程中實現的設計決策和替代方法。

V8 中的元素類型

· 閱讀時間約 14 分鐘
Mathias Bynens ([@mathias](https://twitter.com/mathias))
備註

注意: 如果您更喜歡觀看演示,而不是閱讀文章,請欣賞以下視頻!

JavaScript 對象可以具有任何與之關聯的任意屬性。對象屬性的名稱可以包含任意字符。JavaScript 引擎可以選擇優化的有趣案例之一就是屬性名稱是純數字的情況,特別是 陣列索引

V8中的快速屬性

· 閱讀時間約 13 分鐘
Camillo Bruni ([@camillobruni](https://twitter.com/camillobruni)), 也是 [“快速的 `for`-`in`”](/blog/fast-for-in) 的作者

在這篇博客文章中,我們想解釋V8如何在內部處理JavaScript屬性。從JavaScript的角度看,屬性只需要少量的區分。JavaScript對象主要表現為字典形式,具有字符串鍵和任意對象作為值。不過,規範確實會在迭代過程中將整數索引的屬性與其他屬性區分開來。除此之外,無論是整數索引還是非整數索引的屬性,行為大致相同。

快速的 `for`-`in` 在 V8

· 閱讀時間約 13 分鐘
Camillo Bruni ([@camillobruni](http://twitter.com/camillobruni))

for-in 是許多框架中廣泛使用的語言特性。儘管它的廣泛應用,從實現角度來看,它卻是較為晦澀的語言構造之一。V8 為了讓這個特性儘可能快付出了極大的努力。在過去的一年中,for-in 在符合規範的同時變得最多快了三倍,這取決於使用的上下文。