摘要:語言新特性現(xiàn)在返回源代碼的所有內容,包括空格和注釋。隨著去年發(fā)布的新的字節(jié)碼解釋器,我們擴展了這個功能,以便在后臺線程上將源代碼編譯為字節(jié)碼。
每六周,我們都會創(chuàng)建一個 V8 的新分支,作為我們發(fā)布流程的一部分。每個版本都是在 Chrome Beta 里程碑之前從 V8 的 Git master 分支出來的。今天(2018-03-27),我們很高興地宣布,我們發(fā)布了一個新的分支:V8 version 6.6,在幾個星期內,我們會發(fā)布 Chrome 66 Stable 版,在此之前它依然處于測試階段。V8 v6.6 提供了面向開發(fā)人員的一些很酷的特性。本文提供了預期發(fā)布的一些亮點預覽。
JavaScript 語言新特性Function.prototype.toString() 現(xiàn)在返回源代碼的所有內容,包括空格和注釋。以下是一個舊行為和新行為的對比例子:
// 注意 `function` 關鍵詞之前的注釋以及空格 function /* a comment */ foo () {} // 之前版本: foo.toString(); // → "function foo() {}" // ^ no comment // ^ no space // 新版本: foo.toString(); // → "function /* comment */ foo () {}"
行分隔符(U+2028)和段落分隔符(U+2029)現(xiàn)在允許出現(xiàn)在字符串文字中,matching JSON。以前,這些符號被視為字符串中的行結束符,因此使用它們會導致 SyntaxError 異常。
在異常捕獲的 catch 子句中可以不加參數: catch 的參數可以省略了 optional-catch-binding。如果您不需要在異常代碼中處理 exception 對象,這非常有用。
try { doSomethingThatMightThrow(); } catch { // → Look mom, no binding! handleException(); }
除了 String.prototype.trim() 外,V8 現(xiàn)在實現(xiàn)了 String.prototype.trimStart() 和 String.prototype.trimEnd()。此功能以前是通過非標準 trimLeft() 和 trimRight() 方法提供的,這些方法仍然是新方法的別名,用于向后兼容。
const string = " hello world "; string.trimStart(); // → "hello world " string.trimEnd(); // → " hello world" string.trim(); // → "hello world"
Array.prototype.values() 方法返回了數組的迭代接口,就像 ES2015 的 Map 和 Set 一樣:現(xiàn)在我們可以使用 keys、values、entries 進行遍歷。此更改有可能與現(xiàn)有的 JavaScript 代碼不兼容。如果您發(fā)現(xiàn)某個網站有奇怪的行為或代碼運行中斷了,請嘗試通過 chrome://flags/#enable-array-prototype-values 禁用此功能,并提出問題。
緩存執(zhí)行過的代碼“冷加載(cold load)”和“溫加載(warm load)”這兩個術語在關于加載性能方面是眾所周知的。在 V8 中,還有熱加載(hot load)的概念。我們以 Chrome 為例說明加載的不同級別:
冷加載(cold load):Chrome 首次看到訪問的網頁,并且根本沒有任何數據緩存。
溫加載(warm load):Chrome 會記住網頁已被訪問,并且可以從緩存中檢索某些資源(例如圖像和腳本源文件)。V8 意識到頁面使用了相同的腳本文件,因此將編譯后的代碼與腳本文件一起緩存在磁盤緩存中。
熱加載(hot load):Chrome 第三次訪問網頁時,從磁盤緩存載入腳本文件時,它還向 V8 提供上次加載期間緩存的代碼。V8 可以使用這個緩存代碼來避免必須從頭開始解析和編譯腳本。
在 V8 v6.6 之前,我們在頂層編譯后立即緩存生成的代碼。V8 只編譯已知在頂層編譯過程中立即執(zhí)行的函數,并將其他函數標記為延遲編譯。這意味著緩存代碼只包含頂級代碼,而所有其他函數必須在每次頁面加載時從頭開始進行延遲編譯。從版本 6.6 開始,V8 會緩存頂級代碼執(zhí)行之后的腳本生成的代碼。在我們執(zhí)行腳本時,更多的函數會被編譯并且可以被包含在緩存中。因此,這些函數不需要在未來頁面加載時編譯,從而將熱加載(hot load)場景中的編譯和解析時間縮短 20-60%。對最終用戶可見的是,提供了一個不太擁擠的主線程,因此會更順暢,而且有更快的加載體驗。
之后我們會編寫此主題相關的詳細博客文章。(已經發(fā)布并翻譯:V8 6.6 進一步改進緩存性能)
后臺編譯一段時間以來,V8 已經能夠在后臺線程上解析 JavaScript 代碼。隨著去年發(fā)布的 V8 新的 Ignition 字節(jié)碼解釋器,我們擴展了這個功能,以便在后臺線程上將 JavaScript 源代碼編譯為字節(jié)碼。這使得嵌入 V8 引擎的軟件可以在主線程中執(zhí)行更多工作,來執(zhí)行更多的 JavaScript 腳本。我們在 Chrome 66 中啟用了此功能,在通常的網站上,主線程編譯時間減少了 5% 到 20%。有關更多詳細信息,請參閱[此功能的最新博客文章(https://v8project.blogspot.co...。
移除 AST 編碼去年 Ignition 和 TurboFan 推出后,我們繼續(xù)從簡化編譯流水線(pipeline)中獲益。以前在代碼解析(parsing)后還需要一個名為 "AST Numbering(AST編碼)" 的階段,用來對生成的抽象語法樹中的節(jié)點進行編號,之后編譯器使用此節(jié)點時可以有共同的引用點。
隨著時間的推移,這個后處理過程(post-processing)已經擴展到包含其他功能:為生成器和異步函數的暫停點進行編號,收集需要迫切編譯的內部函數,初始化文字字面量或檢測不可優(yōu)化的代碼模式。
通過新的流水線(pipeline),Ignition 字節(jié)碼成為常用的引用點,并且不再需要編號 - 但是,仍然需要其它的功能,并且仍然保留了 AST 編號。
在 V8 v6.6 中,我們終于設法移除了其余的功能或將其移動到了其他地方,這些工作在解析過程中完成,從而避免了對 AST 的遍歷。這導致實際編譯時間提高了 3-5%。
異步性能改進我們?yōu)?Promise 和異步函數取得了一些不錯的性能改進,特別是設法縮小了異步函數和 promise 鏈之間的差距。
此外,異步生成器和異步迭代的性能也得到顯著提高,在即將發(fā)布的 Node 10 LTS 版中會包含 V8 v6.6。
作為一個例子,考慮下面的斐波那契序列:
async function* fibonacciSequence() { for (let a = 0, b = 1;;) { yield a; const c = a + b; a = b; b = c; } } async function fibonacci(id, n) { for await (const value of fibonacciSequence()) { if (n-- === 0) return value; } }
我們已經測量了這種模式在 Babel transpilation 之前和之后的改進:
最后,字節(jié)碼改進也提高了這些“可暫停”函數的運行時性能:生成器,異步函數和模塊,并減少了它們的編譯大小。我們計劃在即將發(fā)布的版本中進一步改進異步函數和異步生成器的性能,敬請關注。
數組性能改進Array#reduce 對于 holey double arrays 吞吐量性能提高了 10 倍以上(請參閱我們的博客文章,了解 “holey 數組”和 “packed 數組”是什么)。
不受信任的代碼保護在 V8 v6.6 中,我們針對旁路信道漏洞采取了更多緩解措施,以防止信息泄露給不可信的 JavaScript 和 WebAssembly 代碼。
不再需要 GYP這是第一個沒有 GYP 文件的 V8 正式版本。如果您的產品需要 GYP 文件,則需要自行將它們復制到您自己的源代碼庫中。
內存分析Chrome 的 DevTools 現(xiàn)在可以跟蹤和快照 C++ DOM 對象,并顯示 JavaScript 引用的所有可訪問的 DOM 對象。這個特性是 V8 垃圾收集器的新 C++ 跟蹤機制的好處之一。欲了解更多信息,請查看專門的博客文章:Chrome 66 使用 DevTools 跟蹤 JS 對象和 DOM 對象的引用。
V8 API請使用 git log branch-heads/6.5..branch-heads/6.6 include/v8.h 獲取 API 的變更列表。
對于使用 git 的 V8 開發(fā)者,可以通過 git checkout -b 6.6 -t branch-heads/6.6 簽出 V8 v6.6 中的新功能進行試驗。或者,您可以訂閱 Chrome 的 Beta 頻道,這樣可以盡快嘗試新功能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113168.html
摘要:語言新特性現(xiàn)在返回源代碼的所有內容,包括空格和注釋。隨著去年發(fā)布的新的字節(jié)碼解釋器,我們擴展了這個功能,以便在后臺線程上將源代碼編譯為字節(jié)碼。 每六周,我們都會創(chuàng)建一個 V8 的新分支,作為我們發(fā)布流程的一部分。每個版本都是在 Chrome Beta 里程碑之前從 V8 的 Git master 分支出來的。今天(2018-03-27),我們很高興地宣布,我們發(fā)布了一個新的分支:V8 ...
對于了解Node的開發(fā)人員,我們都知道Node是基于Chrome V8引擎開發(fā)的能使JavaScript在服務器端運行的運行時環(huán)境(runtime environment)。一方面,它提供了多種可調用的API,如讀寫文件、網絡請求、系統(tǒng)信息等。另一方面,因為CPU執(zhí)行的是機器碼,它還負責將JavaScript代碼解釋成機器指令序列執(zhí)行,這部分工作是由V8引擎完成。 Motivation JavaS...
摘要:斯坦福宣布使用作為計算機課程的首選語言近日,某位有年教學經驗的斯坦福教授決定放棄,而使用作為計算機入門課程的教學語言。斯坦福官方站點將它們新的課程描述為是最流行的構建交互式的開發(fā)語言,本課程會用講解中的實例。 前端每周清單第 11 期:Angular 4.1支持TypeScript 2.3,Vue 2.3優(yōu)化服務端渲染,優(yōu)秀React界面框架合集 為InfoQ中文站特供稿件,首發(fā)地址為...
摘要:為了避免與引擎混淆,我們放棄了并將其稱為。雖然是使用的默認引擎,但是提供了一個通用的平臺,允許開發(fā)者選擇不同的引擎。的發(fā)布非常令人興奮,并且是社區(qū)內的一件大事。此外,開發(fā)者最關注的就是性能。基準測試沒有考慮垃圾收集事件的數量。 本文翻譯自 Picking the best JS engine for your Node app’s performance,中文版首發(fā)在我的知乎專欄 V8...
閱讀 3172·2021-09-22 15:05
閱讀 2748·2019-08-30 15:56
閱讀 1054·2019-08-29 17:09
閱讀 792·2019-08-29 15:12
閱讀 2075·2019-08-26 11:55
閱讀 3036·2019-08-26 11:52
閱讀 3370·2019-08-26 10:29
閱讀 1374·2019-08-23 17:19