给 V8 一个提醒:通过显式编译提示加速 JavaScript 启动
快速运行 JavaScript 是响应式网络应用的关键。即使有 V8 的高级优化,在启动时解析和编译关键 JavaScript 仍然会导致性能瓶颈。知道在初始脚本编译期间应编译哪些 JavaScript 函数可以加速网页加载。
快速运行 JavaScript 是响应式网络应用的关键。即使有 V8 的高级优化,在启动时解析和编译关键 JavaScript 仍然会导致性能瓶颈。知道在初始脚本编译期间应编译哪些 JavaScript 函数可以加速网页加载。
V8的最终优化编译器Turbofan以使用节点海洋 (SoN)而闻名,这是少数几个在生产环境中使用的大规模编译器之一。然而,从大约三年前开始,我们逐步放弃节点海洋,采用一种更传统的控制流图 (CFG) 中间表示 (IR),我们将其命名为Turboshaft。目前,Turbofan的整个JavaScript后端已经改用Turboshaft,而WebAssembly的整个管道也采用了Turboshaft。Turbofan的两个部分仍然使用一些节点海洋:一个是内置管道,我们正在慢慢被Turboshaft替换;另一个是JavaScript管道的前端,我们正在用另一个基于控制流图的IR(Maglev)代替。本文将阐述我们为何离开节点海洋的原因。
在 V8 中,我们始终致力于提升 JavaScript 性能。作为此项工作的一个部分,我们最近重新审视了 JetStream2 基准测试套件,以消除性能瓶颈。本篇文章详细介绍了我们进行的一项优化,该优化使 async-fs
基准测试的性能提升了显著的 2.5 倍
,并对整体得分产生了显著影响。这项优化源于基准测试,但类似的模式确实存在于 真实代码中。
JavaScript Promise 集成 (JSPI) API 允许以假定 同步 访问外部功能编写的 WebAssembly 应用程序能够在实际功能为 异步 的环境中流畅运行。
WebAssembly 的 JavaScript Promise 集成 (JSPI) API 有一个新 API,可在 Chrome M126 版本中使用。我们讨论了变化的内容、如何配合 Emscripten 使用以及 JSPI 的路线图。
JSPI 是一个允许使用 顺序 API 的 WebAssembly 应用程序访问 异步 Web API 的接口。许多 Web API 是通过 JavaScript Promise
对象设计的:它们不会立即执行请求的操作,而是返回一个 Promise
来完成这些操作。而另一方面,许多编译为 WebAssembly 的应用程序源自 C/C++ 领域,那里主要由阻塞调用者直到任务完成的 API 主导。
经过近三年的时间,从最初的设计文档到数百个代码提交,V8沙盒——一个面向V8的轻量级进程内沙盒——现在已经发展到不再被认为是实验性的安全特性。从今天开始,V8沙盒被纳入Chrome漏洞奖励计划 (VRP)。虽然在其成为强大的安全边界之前仍有许多问题需要解决,但纳入漏洞奖励计划是朝着这一方向的重要一步。因此,Chrome 123可以被视为沙盒的某种“测试版”发布。这篇博客文章借此机会讨论了沙盒的动机,展示了它如何防止V8中的内存损坏扩散到主进程,并最终解释了为什么它是实现内存安全的必要步骤。
WebAssembly 的 JavaScript Promise 集成 (JSPI) API 正在随着 Chrome M123 版本进入原始试验阶段。这意味着您可以测试您和您的用户是否能够从这个新 API 中受益。
JSPI 是一个 API,允许所谓的顺序代码(已编译为 WebAssembly)访问 异步 的 Web API。许多 Web API 是以 JavaScript 的 Promise
表达的:它们不是立即执行请求的操作,而是返回一个 Promise
来执行。当操作最终执行时,浏览器的任务运行器会用 Promise 调用任何回调。JSPI 接入这个架构,使 WebAssembly 应用程序在返回 Promise
时暂停,并在 Promise
被解析时恢复运行。
你是否曾想过 undefined
、true
和其他核心JavaScript对象是从哪里来的?这些对象是任何用户定义对象的原子,并且必须首先存在。V8将它们称为不可移动的不可变根,它们位于自己的堆——只读堆中。由于它们被频繁使用,快速访问至关重要。而什么比在编译时正确猜测它们的内存地址更快呢?
欢迎来到激动人心的V8世界,在这里速度不仅仅是一种特性,而是一种生活方式。随着我们向2023告别,是时候庆祝V8今年取得的令人印象深刻的成就了。
通过创新的性能优化,V8继续拓展Web不断演变的边界。我们引入了新的中层编译器,并对顶级编译器基础设施、运行时和垃圾回收器进行了多项改进,从而实现了全方位的显著速度提升。
在Chrome M117中,我们引入了一个新的优化编译器:Maglev。Maglev位于现有的Sparkplug和TurboFan编译器之间,扮演快速生成足够优质代码优化编译器的角色。
直到2021年,V8有两个主要的执行层级:Ignition(解释器)和TurboFan(V8的优化编译器,专注于峰值性能)。所有的JavaScript代码都首先被编译为Ignition字节码,并通过解释执行。在执行期间,V8记录程序的行为,包括跟踪对象的形状和类型。执行过程中收集的元数据和字节码会被传递到优化编译器,以生成高性能的、通常基于推测的机器代码,这种机器代码运行速度明显快于解释器。