JS 引擎 V8 發佈 v7.4 性能再次大幅提高

JavaScript 引擎 V8 發佈了 7.4 版本,目前處於 beta 階段,正式版將於幾個星期後與 Chrome 74 Stable
一起發佈。此版本帶來了一些新特性,並極大提升了性能。
V8
現在不需要運行時分配可執行記憶體就可以執行 JavaScript。

WebAssembly Threads/Atomics

在非 Android 操作系統上啟用了 WebAssembly Threads/Atomics,可以通過 chrom://flags/#enable-webassembly-threads 在 Chrome 中啟用此功能。

此特性可以通過 WebAssembly 解鎖用戶計算機上多核的使用,從而在 Web 上實現新的、計算量大的用例。

性能提升

參數不匹配的調用速度更快

JavaScript 中允許調用函數時參數的數量與定義時不同的情況,不管是參數少了還是多了都完全有效,同時 JavaScript 函數可以通過參數對象、rest 參數等方式獲取實際參數。因此,JavaScript 引擎中必須提供一種獲取實際參數的方法,在 V8 中,這是通過一種稱為參數自適應的技術完成的。

參數自適應可以獲取實際參數,但卻是以性能為代價的,而這種性能損耗在現代前端和中間件框架中通常是沒法避免的,因為有太多 API 具有可選參數或可變參數列表了。

V8 7.4 版本中帶來了一項新特性解決了這一問題。

在某些情況下,比如當被調用的是嚴格模式的函數時,既不使用參數也不使用 rest 參數,這時候就完全不需要去進行參數自適應。現在 V8 在這種情況下就直接跳過這一自適應過程,將調用開銷減少了超過 60%。

JS 引擎 V8 發佈 v7.4 性能再次大幅提高

改進了原生訪問器性能

Angular 團隊發現,在 Chrome 中直接通過各自的 get 函數調用 DOM 屬性訪問器之類的原生訪問器,比單態(monomorphic)甚至是綜合態(megamorphic )屬性訪問要慢得多。這是因為在 V8 中使用慢速路徑通過 Function#call() 調用 DOM 訪問器,而不是已經存在屬性訪問的快速路徑。

此版本中提高了調用原生訪問器的性能,使其比綜合態屬性訪問快得多,效果如下:

JS 引擎 V8 發佈 v7.4 性能再次大幅提高

解釋器性能

在 Chrome 中,下載大腳本時是在 worker 線程上以流進行解析的,此版本修復了一個源流中用自定義 UTF-8 進行解碼的問題,修復後使得流式解析性能平均快了 8%。

還在 V8 預解析器中發現了另一個問題:worker 線程中屬性名被不必要地重復。刪除這些重復數據後將流式解析器性能提高了 10.5%。

JS 引擎 V8 發佈 v7.4 性能再次大幅提高

記憶體減少

字節碼 flush

從 JavaScript 源碼編譯的字節碼占據了很大一部分 V8 堆空間,通常約為 15%,包括相關的元數據。但是有許多函數隻在初始化期間執行,或者在編譯後很少使用,這顯然是一種浪費。

為了減少 V8 的記憶體開銷,此版本實現了一項字節碼 flush 新功能,即如果已編譯的字節碼最近沒有被執行,那麼在 GC 期間將從函數中將其清除。為了實現這一點,V8 會跟蹤函數節碼的年齡,在 GC 期間遞增年齡,並在執行函數時將其重置為零。任何超預設「老化閾值」的字節碼的記憶體都會被下一個垃圾回收器收走,並且如果將來再次執行該函數,它將重新編譯其字節碼。

JS 引擎 V8 發佈 v7.4 性能再次大幅提高

該字節碼 flush 功能為 Chrome 用戶節省了大量記憶體,將 V8 堆中的記憶體量減少了 5-15%,同時不會降低性能或顯着增加編譯 JavaScript 代碼所花費的 CPU 時間。

此外還有 JavaScript 私有類字段、V8 API 等改進,詳情查看發佈公告

來源:cnBeta