成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

探秘 Node.js 10 新功能的背后:V8 release 6.6

Labradors / 802人閱讀

摘要:語言新特性現(xiàn)在返回源代碼的所有內(nèi)容,包括空格和注釋。隨著去年發(fā)布的新的字節(jié)碼解釋器,我們擴(kuò)展了這個(gè)功能,以便在后臺(tái)線程上將源代碼編譯為字節(jié)碼。

每六周,我們都會(huì)創(chuàng)建一個(gè) V8 的新分支,作為我們發(fā)布流程的一部分。每個(gè)版本都是在 Chrome Beta 里程碑之前從 V8 的 Git master 分支出來的。今天(2018-03-27),我們很高興地宣布,我們發(fā)布了一個(gè)新的分支:V8 version 6.6,在幾個(gè)星期內(nèi),我們會(huì)發(fā)布 Chrome 66 Stable 版,在此之前它依然處于測試階段。V8 v6.6 提供了面向開發(fā)人員的一些很酷的特性。本文提供了預(yù)期發(fā)布的一些亮點(diǎn)預(yù)覽。

JavaScript 語言新特性

Function.prototype.toString() 現(xiàn)在返回源代碼的所有內(nèi)容,包括空格和注釋。以下是一個(gè)舊行為和新行為的對(duì)比例子:

// 注意 `function` 關(guān)鍵詞之前的注釋以及空格
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。以前,這些符號(hào)被視為字符串中的行結(jié)束符,因此使用它們會(huì)導(dǎo)致 SyntaxError 異常。

在異常捕獲的 catch 子句中可以不加參數(shù): catch 的參數(shù)可以省略了 optional-catch-binding。如果您不需要在異常代碼中處理 exception 對(duì)象,這非常有用。

try {
  doSomethingThatMightThrow();
} catch { // → Look mom, no binding!
  handleException();
}

除了 String.prototype.trim() 外,V8 現(xiàn)在實(shí)現(xiàn)了 String.prototype.trimStart() 和 String.prototype.trimEnd()。此功能以前是通過非標(biāo)準(zhǔn) trimLeft()trimRight() 方法提供的,這些方法仍然是新方法的別名,用于向后兼容。

const string = "  hello world  ";
string.trimStart();
// → "hello world  "
string.trimEnd();
// → "  hello world"
string.trim();
// → "hello world"

Array.prototype.values() 方法返回了數(shù)組的迭代接口,就像 ES2015 的 MapSet 一樣:現(xiàn)在我們可以使用 keys、valuesentries 進(jìn)行遍歷。此更改有可能與現(xiàn)有的 JavaScript 代碼不兼容。如果您發(fā)現(xiàn)某個(gè)網(wǎng)站有奇怪的行為或代碼運(yùn)行中斷了,請(qǐng)嘗試通過 chrome://flags/#enable-array-prototype-values 禁用此功能,并提出問題。

緩存執(zhí)行過的代碼

“冷加載(cold load)”和“溫加載(warm load)”這兩個(gè)術(shù)語在關(guān)于加載性能方面是眾所周知的。在 V8 中,還有熱加載(hot load)的概念。我們以 Chrome 為例說明加載的不同級(jí)別:

冷加載(cold load):Chrome 首次看到訪問的網(wǎng)頁,并且根本沒有任何數(shù)據(jù)緩存。

溫加載(warm load):Chrome 會(huì)記住網(wǎng)頁已被訪問,并且可以從緩存中檢索某些資源(例如圖像和腳本源文件)。V8 意識(shí)到頁面使用了相同的腳本文件,因此將編譯后的代碼與腳本文件一起緩存在磁盤緩存中。

熱加載(hot load):Chrome 第三次訪問網(wǎng)頁時(shí),從磁盤緩存載入腳本文件時(shí),它還向 V8 提供上次加載期間緩存的代碼。V8 可以使用這個(gè)緩存代碼來避免必須從頭開始解析和編譯腳本。

在 V8 v6.6 之前,我們?cè)陧攲泳幾g后立即緩存生成的代碼。V8 只編譯已知在頂層編譯過程中立即執(zhí)行的函數(shù),并將其他函數(shù)標(biāo)記為延遲編譯。這意味著緩存代碼只包含頂級(jí)代碼,而所有其他函數(shù)必須在每次頁面加載時(shí)從頭開始進(jìn)行延遲編譯。從版本 6.6 開始,V8 會(huì)緩存頂級(jí)代碼執(zhí)行之后的腳本生成的代碼。在我們執(zhí)行腳本時(shí),更多的函數(shù)會(huì)被編譯并且可以被包含在緩存中。因此,這些函數(shù)不需要在未來頁面加載時(shí)編譯,從而將熱加載(hot load)場景中的編譯和解析時(shí)間縮短 20-60%。對(duì)最終用戶可見的是,提供了一個(gè)不太擁擠的主線程,因此會(huì)更順暢,而且有更快的加載體驗(yàn)。

之后我們會(huì)編寫此主題相關(guān)的詳細(xì)博客文章。(已經(jīng)發(fā)布并翻譯:V8 6.6 進(jìn)一步改進(jìn)緩存性能)

后臺(tái)編譯

一段時(shí)間以來,V8 已經(jīng)能夠在后臺(tái)線程上解析 JavaScript 代碼。隨著去年發(fā)布的 V8 新的 Ignition 字節(jié)碼解釋器,我們擴(kuò)展了這個(gè)功能,以便在后臺(tái)線程上將 JavaScript 源代碼編譯為字節(jié)碼。這使得嵌入 V8 引擎的軟件可以在主線程中執(zhí)行更多工作,來執(zhí)行更多的 JavaScript 腳本。我們?cè)?Chrome 66 中啟用了此功能,在通常的網(wǎng)站上,主線程編譯時(shí)間減少了 5% 到 20%。有關(guān)更多詳細(xì)信息,請(qǐng)參閱[此功能的最新博客文章(https://v8project.blogspot.co...。

移除 AST 編碼

去年 Ignition 和 TurboFan 推出后,我們繼續(xù)從簡化編譯流水線(pipeline)中獲益。以前在代碼解析(parsing)后還需要一個(gè)名為 "AST Numbering(AST編碼)" 的階段,用來對(duì)生成的抽象語法樹中的節(jié)點(diǎn)進(jìn)行編號(hào),之后編譯器使用此節(jié)點(diǎn)時(shí)可以有共同的引用點(diǎn)。

隨著時(shí)間的推移,這個(gè)后處理過程(post-processing)已經(jīng)擴(kuò)展到包含其他功能:為生成器和異步函數(shù)的暫停點(diǎn)進(jìn)行編號(hào),收集需要迫切編譯的內(nèi)部函數(shù),初始化文字字面量或檢測不可優(yōu)化的代碼模式。

通過新的流水線(pipeline),Ignition 字節(jié)碼成為常用的引用點(diǎn),并且不再需要編號(hào) - 但是,仍然需要其它的功能,并且仍然保留了 AST 編號(hào)。

在 V8 v6.6 中,我們終于設(shè)法移除了其余的功能或?qū)⑵湟苿?dòng)到了其他地方,這些工作在解析過程中完成,從而避免了對(duì) AST 的遍歷。這導(dǎo)致實(shí)際編譯時(shí)間提高了 3-5%。

異步性能改進(jìn)

我們?yōu)?Promise 和異步函數(shù)取得了一些不錯(cuò)的性能改進(jìn),特別是設(shè)法縮小了異步函數(shù)和 promise 鏈之間的差距。

此外,異步生成器和異步迭代的性能也得到顯著提高,在即將發(fā)布的 Node 10 LTS 版中會(huì)包含 V8 v6.6。

作為一個(gè)例子,考慮下面的斐波那契序列:

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;
  }
}

我們已經(jīng)測量了這種模式在 Babel transpilation 之前和之后的改進(jìn):

最后,字節(jié)碼改進(jìn)也提高了這些“可暫?!焙瘮?shù)的運(yùn)行時(shí)性能:生成器,異步函數(shù)和模塊,并減少了它們的編譯大小。我們計(jì)劃在即將發(fā)布的版本中進(jìn)一步改進(jìn)異步函數(shù)和異步生成器的性能,敬請(qǐng)關(guān)注。

數(shù)組性能改進(jìn)

Array#reduce 對(duì)于 holey double arrays 吞吐量性能提高了 10 倍以上(請(qǐng)參閱我們的博客文章,了解 “holey 數(shù)組”和 “packed 數(shù)組”是什么)。

不受信任的代碼保護(hù)

在 V8 v6.6 中,我們針對(duì)旁路信道漏洞采取了更多緩解措施,以防止信息泄露給不可信的 JavaScript 和 WebAssembly 代碼。

不再需要 GYP

這是第一個(gè)沒有 GYP 文件的 V8 正式版本。如果您的產(chǎn)品需要 GYP 文件,則需要自行將它們復(fù)制到您自己的源代碼庫中。

內(nèi)存分析

Chrome 的 DevTools 現(xiàn)在可以跟蹤和快照 C++ DOM 對(duì)象,并顯示 JavaScript 引用的所有可訪問的 DOM 對(duì)象。這個(gè)特性是 V8 垃圾收集器的新 C++ 跟蹤機(jī)制的好處之一。欲了解更多信息,請(qǐng)查看專門的博客文章:Chrome 66 使用 DevTools 跟蹤 JS 對(duì)象和 DOM 對(duì)象的引用。

V8 API

請(qǐng)使用 git log branch-heads/6.5..branch-heads/6.6 include/v8.h 獲取 API 的變更列表。

對(duì)于使用 git 的 V8 開發(fā)者,可以通過 git checkout -b 6.6 -t branch-heads/6.6 簽出 V8 v6.6 中的新功能進(jìn)行試驗(yàn)?;蛘?,您可以訂閱 Chrome 的 Beta 頻道,這樣可以盡快嘗試新功能。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/113168.html

相關(guān)文章

  • 探秘 Node.js 10 功能背后V8 release 6.6

    摘要:語言新特性現(xiàn)在返回源代碼的所有內(nèi)容,包括空格和注釋。隨著去年發(fā)布的新的字節(jié)碼解釋器,我們擴(kuò)展了這個(gè)功能,以便在后臺(tái)線程上將源代碼編譯為字節(jié)碼。 每六周,我們都會(huì)創(chuàng)建一個(gè) V8 的新分支,作為我們發(fā)布流程的一部分。每個(gè)版本都是在 Chrome Beta 里程碑之前從 V8 的 Git master 分支出來的。今天(2018-03-27),我們很高興地宣布,我們發(fā)布了一個(gè)新的分支:V8 ...

    springDevBird 評(píng)論0 收藏0
  • JavaScript、Node.jsV8關(guān)系

    對(duì)于了解Node的開發(fā)人員,我們都知道Node是基于Chrome V8引擎開發(fā)的能使JavaScript在服務(wù)器端運(yùn)行的運(yùn)行時(shí)環(huán)境(runtime environment)。一方面,它提供了多種可調(diào)用的API,如讀寫文件、網(wǎng)絡(luò)請(qǐng)求、系統(tǒng)信息等。另一方面,因?yàn)镃PU執(zhí)行的是機(jī)器碼,它還負(fù)責(zé)將JavaScript代碼解釋成機(jī)器指令序列執(zhí)行,這部分工作是由V8引擎完成。 Motivation JavaS...

    Cciradih 評(píng)論0 收藏0
  • 前端每周清單第 11 期:Angular 4.1支持TypeScript 2.3,Vue 2.3優(yōu)化

    摘要:斯坦福宣布使用作為計(jì)算機(jī)課程的首選語言近日,某位有年教學(xué)經(jīng)驗(yàn)的斯坦福教授決定放棄,而使用作為計(jì)算機(jī)入門課程的教學(xué)語言。斯坦福官方站點(diǎn)將它們新的課程描述為是最流行的構(gòu)建交互式的開發(fā)語言,本課程會(huì)用講解中的實(shí)例。 前端每周清單第 11 期:Angular 4.1支持TypeScript 2.3,Vue 2.3優(yōu)化服務(wù)端渲染,優(yōu)秀React界面框架合集 為InfoQ中文站特供稿件,首發(fā)地址為...

    warkiz 評(píng)論0 收藏0
  • 為您 Node 性能選擇最佳 JS 引擎

    摘要:為了避免與引擎混淆,我們放棄了并將其稱為。雖然是使用的默認(rèn)引擎,但是提供了一個(gè)通用的平臺(tái),允許開發(fā)者選擇不同的引擎。的發(fā)布非常令人興奮,并且是社區(qū)內(nèi)的一件大事。此外,開發(fā)者最關(guān)注的就是性能。基準(zhǔn)測試沒有考慮垃圾收集事件的數(shù)量。 本文翻譯自 Picking the best JS engine for your Node app’s performance,中文版首發(fā)在我的知乎專欄 V8...

    huaixiaoz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<