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

阅读数:9389 2019 年 8 月 10 日 08:00

谷歌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

评论

发布