V8 发布 v7.4
每六周,我们创建一个新的 V8 分支做为我们发布进程的一部分。每一个版本都是在一个新的 Chrome Beta 版本之前从 V8 的 master 分支切出来。今天我们宣布发布最新的 V8 v7.4 分支,在对应的 Chrome 74 Stable 版本发布前的几周,它都将做为 Beta 版本存在。
V8 无 JIT 模式(JIT-less V8)
V8 现在支持执行 JavaScript 而无需在运行时分配可执行内存。要深入了解这个特性,可以阅读之前的文章: V8 v7.4 支持无 JIT 模式
发布 WebAssembly 多线程(WebAssembly Threads/Atomics)
WebAssembly 多线程在非 Android 系统中已经启用。包含了我们之前在 v7.0 版本中所实验/预览的功能。Web 基础知识文章里有一篇介绍如何使用 WebAssembly Atomics 的文章。
这个特性解锁了通过 WebAssembly 对用户机器的多核使用能力,从而在 Web 端实现新的、重计算的使用场景。
性能方面
参数不匹配的函数调用性能优化
在 JavaScript 中,使用太少或太多参数调用函数(即传递少于或多于声明的形式参数)都是有效的。 前者称为缺少投入(under-application),后者称为过度投入(over-application)。 如果缺少投入,则剩余的形式参数将被赋值为 undefined
,而在过度投入的情况下,将忽略多余的参数。
然后,JavaScript 函数仍然可以通过 arguments
、rest parameters
、 Function.prototype.arguments
属性(非严格模式下)获取实际传入的参数。导致 JavaScript 引擎必须提供一种方法来获取实际的参数。在 V8 中这个方法是通过参数适配来实现,它在缺少/过度投入时提供实际传入的参数。不幸的是,参数适配带来了性能的消耗,而且这种情况在现代的前端或中间件框架中很常见(例如:很多 API 使用可选参数或参数列表变数)。
在一些场景中引擎知道参数适配是不需要的,因为实际参数是不可观察的,换句话说,当被调用者是严格模式或者被调用函数中既没有使用 arguments
也没有使用 rest parameters
。这种情况下,V8 完全可以跳过参数适配,从而将函数调用性能开销降低高达 60% 。