JavaScript 引擎V8 發布7.6 版本:別問,問就提升性能
JavaScript 引擎V8 發布了7.6 版本,目前處於beta 階段,正式版將於幾個星期後隨 Chrome 76 Stable 一起發布。此版本通過以下幾個特性改進又提升了性能:
改進JSON.parse在現代JavaScript 應用中,JSON 通常用作傳遞結構化數據的格式。通過加速JSON 解析,可以減少通信的延遲。此版本中,JSON 解析器進行了大修,以便更快地掃描和解析JSON,這使得流行網頁提供的數據解析速度提高了2.7 倍。
在V8 v7.5之前,JSON解析器是一個遞歸解析器,它的原生堆棧空間受傳入JSON數據的嵌套深度影響,這意味著可以在非常深層嵌套的JSON數據中用盡堆棧空間。V8 v7.6把它改成了一個迭代解析器,現在管理自己的堆棧,堆棧僅受可用內存的限制。
另一方面,新的JSON 解析器也更具內存效率,通過在創建最終對象之前緩衝屬性,現在可以決定如何以最佳方式分配結果。
改進frozen/sealed 數組
對frozen 與 sealed 數組(以及類似數組的對象)的調用性能得到提升。此版本增強了以下JavaScript 編碼模式,其中frozen 是frozen 或sealed 數組或類似數組的對象:
frozen.indexOf(v)
frozen.includes(v)
- 傳遞調用,如
fn(...frozen)
- 使用嵌套數組傳播來傳播調用,如
fn(...[...frozen])
- 使用數組傳播應用調用,如
fn.apply(this, [...frozen])
這樣一來,性能有巨幅提升,如下圖所示:
Unicode string 處理
優化將字符串轉換為 Unicode 的處理顯著提高了String#localeCompare、String#normalize 和一些Intl API 等調用的速度。例如,對於單字節字符串,String#localeCompare 的原始吞吐量約為原來的2 倍。
JavaScript 語言特性方面,也有以下幾點更新:
Promise.allSettled
Promise.allSettled(promises) 在所有輸入promise 處於settled 狀態時提供一個信號,這意味著它們要么被fulfilled 要么被rejected。
改進BigInt 支持
BigInt 現在有更好的API 支持,可以使用toLocaleString 方法以區域設置感知方式格式化BigInt。
12345678901234567890n.toLocaleString('en'); // → '12,345,678,901,234,567,890'12345678901234567890n.toLocaleString('de'); // → '12.345.678.901.234.567.890'
改進 Intl.DateTimeFormat
應用通常顯示日期間隔或日期範圍以顯示事件的範圍,例如酒店預訂、服務的計費周期或音樂節。Intl.DateTimeFormat API 現在支持formatRange 和formatRangeToParts 方法,以便以特定於語言環境的方式方便地格式化日期範圍。
const start = ne WD ate('2019-05-07T09:20:00');// → 'May 7, 2019'const end = newDate('2019-05-09T16:00:00');// → 'May 9, 2019'const fmt = newIntl.DateTimeFormat('en', { year: 'numeric', month: 'long', day: 'numeric', });const output = fmt.formatRange(start, end);// → 'May 7 – 9, 2019'const parts = fmt.formatRangeToParts(start, end);// → [// → { 'type': 'month', 'value': 'May', 'source': 'shared' },// → { 'type': 'literal', 'value': ' ', 'source': 'shared' },/ / → { 'type': 'day', 'value': '7', 'source': 'startRange' },// → { 'type': 'literal', 'value': ' – ', 'source ': 'shared' },// → { 'type': 'day', 'value': '9', 'source': 'endRange' },// → { 'type': 'literal', 'value ': ', ', 'source': 'shared' },// → { 'type': 'year', 'value': '2019', 'source': 'shared' },// → ]
此外,format、formatToParts 和formatRangeToParts 方法現在支持新的timeStyle 和dateStyle 選項:
const dtf = newIntl.DateTimeFormat('de', { timeStyle: 'medium', dateStyle: 'short'}); dtf.format(Date.now());// → '19.06.19, 13:33:37'
原生堆棧遍歷
雖然V8在DevTools中進行調試或分析等情況下可以使用自己的調用堆棧,但Windows操作系統無法在x64架構上遍歷包含TurboFan生成的代碼的調用堆棧。當使用原生調試器或ETW採樣來分析使用V8的進程時,這可能會導致堆棧損壞。新版本V8能夠為Windows註冊必要的元數據,使得可以在x64上運行這些堆棧,v7.6默認啟用此功能。