JavaScript 引擎 V8 发布 8.6 版本

2020年09月23日

JavaScript 引擎 V8 发布了 8.6 版本(测试阶段),正式版本将在之后随 Chrome 86 一起推出。8.6 版本带来了一些面向开发人员的特性,主要亮点包括:

JavaScript

开源 JS-Fuzzer

JS-Fuzzer 一直是 V8 稳定性和安全性的基石,现在它开源了。

最近 V8 团队开始以差异测试模式运行 fuzzer 实例,以检测 JavaScript 的正确性问题。

Number.prototype.toString 中的加速

在一般情况下,将 JavaScript 数字转换为字符串可能会非常复杂,必须考虑浮点精度、科学计数法、NaN、无穷大、舍入等。在计算之前,甚至不知道结果字符串的大小。因此,V8 对 Number.prototype.toString 的实现将提供给 C++ 运行时函数。

但很多时候,你可能只想打印一个简单的小整数(“Smi”)。这是一个简单得多的操作,不再需要调用 C++ 运行时函数的开销。因此,V8 团队为使用 Torque 编写的 Number.prototype.toString 添加了一个小整数的简单快速路径,以减少这种常见情况的开销。

Atomics.wake 已删除

将 Atomics.wake 重命名为 Atomics.notify 以匹配 v7.3 中的规格更改。现在,已弃用的 Atomics.wake 别名已删除。

此外,还有一些小的规范变化。

WebAssembly

在 Liftoff 中实现 SIMD

Liftoff 是 WebAssembly 的基准编译器,从 V8 v8.5 开始,所有平台上均已提供。SIMD 提案使 WebAssembly 可以利用常用的硬件矢量指令来加速计算密集型工作负载。它目前处于实验阶段。

SIMD 仅在 V8 的顶级编译器 TurboFan 中实现。现在,Liftoff 中也实现了 SIMD,你将可以在 Liftoff 中调试 SIMD 代码,其性能要比 WebAssembly 解释器好得多。

使用 Liftoff 标量实现作为基准,会看到以下结果:

Liftoff SIMD 的速度比 Liftoff 标量快 2.8 倍,而 TurboFan SIMD 的速度要快 7.5 倍。

Wasm 到 JS 的调用速度更快

如果 WebAssembly 调用导入的 JavaScript 函数,则通过所谓的 “Wasm-to-JS wrapper”(或 “import wrapper”)进行调用。此包装器将参数转换为 JavaScript 可以理解的对象,并在返回 JavaScript 调用时,将返回值转换回 WebAssembly。

为了确保 JavaScript 参数对象准确反映从 WebAssembly 传递来的参数,如果检测到参数数量不匹配,则通过所谓的 “arguments adapter trampoline” 进行调用。

但是在很多情况下,这不是必需的,因为被调用的函数不使用 arguments 对象。v8.6 版本获得了一个修复程序,该程序避免了在这种情况下通过参数适配器进行的调用,这使得受影响的调用明显更快。

发布公告

展开阅读全文
3 收藏
分享
加载中
最新评论 (1)
加速,加速
2020-09-23 17:32
0
回复
举报
更多评论
1 评论
3 收藏
分享
返回顶部
顶部