谷歌V8 JavaScript引擎7.4到7.6版本带来大量改进

最近,谷歌V8 JavaScript引擎7.4、7.5和7.6版本增加了一些WebAssembly特性和JavaScript性能改进。

V8 7.4还增加了WebAssembly Threads/Atomics。Threads/Atomics最初作为V8 7.0的实验性特性,允许在多核架构上使用WebAssembly,支持Web的计算密集型进程。

Chrome 75为WebAssembly添加了隐式缓存,允许从缓存中提取已经编译好的WebAssembly模块,而不是根据每个视图重新编译。V8的非Chromium用户也可以使用Chromium提供的隐式缓存方案。

V8 7.5版本支持WebAssembly的大块内存提案,该提案提供了更新大内存块或表的新指令。

V8 7.4增加了对ECMAScript私有类字段语法的支持,这些字段在类之外不可访问。

数值分隔符是一个新的特性提案,预计将在ES2020中实现,但现在V8 7.5已经支持该特性,使人类可以更容易地查看非常大的数字字面量。

V8 7.4还增加了对Intl.Locale的支持,Intl.Locale是ECMA-402国际化规范的一部分,为管理地区和有效提取特定于地区的首选项提供了更健壮的机制。

V8 7.6改进了Intl.DateTimeFormat,提供了formatRange和formatRangeToParts方法,可以更容易地以特定于语言环境的方式格式化日期范围,还可以添加timeStyle和dateStyle选项。

Promise.allSettled(promises)是V8 7.6中添加的一个新的JavaScript语言特性。当所有promise都完成(完成或拒绝)时,这个方法会发出信号。

现在,V8 7.6的toLocaleString方法和Intl.NumberFormat API都支持BigInt。

V8的最新版本对JavaScript的性能做了一些改进。

V8 7.6引入了大量与JSON.parse有关的更新,并提供高达2.7倍的解析速度提升。主要的变化是从递归式解析模型到迭代式解析的转变。以前,在解析嵌套很深的JSON数据时,V8可能会将栈耗尽,而现在V8只受可用内存的限制。新的JSON解析器通过优化缓冲属性提高了内存效率。

V8 7.4的改进为参数不匹配的调用提供了更快的调用速度。JavaScript允许使用比正式声明更少(应用不足)或更多(过度应用)的参数来调用函数。在应用不足的场景中,形参被赋值为undefined,而在过度应用的场景中,则会忽略额外的参数。由于JavaScript函数可以通过arguments对象、rest参数等访问实际参数,V8通过arguments适配器提供了对实际参数的访问。现在,V8确定了一些不需要进行这种调整的场景(例如,callee是一个严格的模式函数),从而减少了高达60%的调用开销。

在V8 7.4中,通过get函数直接调用本地访问器比通过较慢的代码路径进行单态或超态属性访问要慢得多。V8通过调用本地访问器提高了性能。

Chrome在下载大型脚本时会在工作线程上对其进行流式解析。V8 7.4修复了使用UTF8解码的脚本的性能问题,平均提高了8%的解析速度。此外,在解析过程中会对属性名进行去重。修复这个问题额外提高了10.5%的解析器性能,同时也提高了小型非流式脚本和内联JavaScript的解析速度。

在Chrome 75中,V8直接将脚本从网络加载到流解析器中,而不是等待Chrome主线程来处理。这个变更改进了JavaScript的解析性能,并减少了并发流解析任务的数量,进一步减少了内存消耗。

V8 7.6改进了数组indexOf、包含、延展和应用调用方面的性能,这篇文章提供了更多相关细节。

V8现在提供了一种无JIT模式,可以在不分配运行时内存的情况下执行JavaScript。通常,V8依赖于在运行时分配和修改可执行内存,这让V8速度变得很快。但有些平台,如iOS、智能电视和游戏机,不允许非特权应用程序访问可执行内存,可能是为了减少应用程序的漏洞。从V8 7.4开始,通过–jitless标志将V8切换到解释器模式,可以在没有运行时分配可执行内存的情况下执行JavaScript。WebAssembly目前不支持无JIT模式。

V8 7.4增加了字节码冲刷功能,通过在垃圾回收期间冲刷不经常被执行的函数字节码来减少V8的内存开销。这个变更减少了5-15%的堆内存使用,而不会降低性能或显著增加编译JavaScript的CPU时间。

V8 7.4还改进了无效字节码的消除。V8团队解释道:

虽然我们并不期望这会对用户代码有多大影响,但它对于简化各种解调(如生成器、for-of和try-catch)特别有用。

在V8 7.6中,Unicode字符串处理得到了显著的改进,比如String#localeCompare、String#normalize和各种国际化API调用。

谷歌每六周都会发布V8的分支版本,以配合谷歌Chrome的发布。V8 7.4随Chrome 74发布, 7.5随Chrome 75发布,7.6随Chrome 76发布。V8还支持Node.js JavaScript运行时。

V8是开源的,由于外部依赖关系,提供了几种许可协议。V8托管在GitHub上,欢迎开发者参与贡献,但必须遵循V8的贡献指南和谷歌的开源行为指南

原文链接

V8 JavaScript Engine 7.4, 7.5, and 7.6 Adds Numerous Performance Improvements

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章