1. 首页

V8 8.0 JavaScript 引擎降低堆内存 40%,添加语言特性 Optional Chaining 和 Null Coalescing

Google 最新发布了 V8 JavaScript 引擎 V8 8.0 ,其中使用压缩指针(pointer compression)技术,在不影响性能的情况下实现堆内存占用降低了 40%。此外,V8 8.0 添加了支持“可选链”( optional chaining )的操作符?.,以及支持“空合并”( nullish coalescence )的双问号操作符??。V8 v8.0 将正式提供在 Chrome 80 版本中。

据 V8 核心成员 Leszek Świrski 介绍,V8 v8.0 对 JavaScript 标签值(tagged value)做了压缩处理。标签值用于表示指向堆或小整数的指针。对于 64 位 CPU,V8 指针并未使用整个 64 位字节表示,而是仅使用了其中的低位字节,高位字节通过算法合成。V8 团队在文档中详细阐述了指针压缩算法,该算法参考了 Java 等平台目前在用的技术。在 InfoQ 的访谈中,Świrski 阐明 V8 v8.0 中使用的内存压缩算法去除了内存地址的头 32 位,强制“压缩”指针到 4GB 空间中,所有“压缩”指针构成 4GB 空间内的相对偏移量。在计算完全指针地址时,需要在压缩指针地址上添加基础偏移量。Świrski 补充说明,团队计划结合使用多字节字对齐和地址层位偏移的方式,将压缩的堆规模扩展到 4GB 以外的空间。其算法的基本理念是将内存地址逻辑上组织到多字节字(word)而非字节中。例如,如果使用 8 字节的字,那么只需将地址表示为从 0、7、15、23 等开始,因此能够实现地址空间扩展到 23*232 字节。

V8 团队特别指出,压缩指针向全指针的转换本身是非常高速的操作,因此压缩指针技术并未引入额外的性能代价。而另一方面的额外收益是,经压缩的指针使得 V8 垃圾回收机制更为高效。初步基准测试表明,在 Facebook、CNN、Google Maps 等网站的实践应用中,V8 v8.0 无论是在移动端还是在桌面设备端都表现得更为快速。

从 JavaScript 语言方面看,V8 v8.0 引入了对“可选链”( optional chaining )和“空合并”( nullish coalescence )两种有用语言特性的支持。

可选链技术意在简化属性值的依次访问运算。由于一些中间对象是 nullundefined,运算存在抛出异常的风险。例如,在下面的代码中,为避免发生上述问题,需预先检查所有需访问的中间属性是经过良好定义的:

复制代码


if (resource && resource.address && resource.address.types) return resource.address.types.length

使用可选链操作符?.,该代码可替换为如下代码。其中确保了一旦中间组件出现nullundefined等问题,整体表达式立刻做出短路处理:

复制代码


return resource?.address?.types?.length

对于空合并操作符??,在如下代码的使用场景中,进一步优化了操作符||

复制代码


let iterations = settings.iterations || 4;

||操作符的不足之处在于,上面的代码中,当所需设置的settings.iterations取值为false(即settings.iterations == 0)时,不能使用||操作符。运算最终依然得到默认值,即4。空合并操作符?? 将会正确处理这类问题。例如:

复制代码


let iterations = settings.iterations ?? 4;

上例中,anullundefined时,运算a ?? b取值为b,否则取值为a

V8 v8.0 目前依然尚未形成 V8 稳定发行版,计划在数周后发布在 Chrome 80 稳定版中。开发人员可使用git checkout -b 8.0 -t branch-heads/8.0命令获取该版本。

2019 年 12 月 23 日更新:添加了 Leszek Świrski 对 V8 中实际采用的指针压缩算法的阐述。

原文链接:

V8 JavaScript Engine 8.0 Reduces Heap by 40%, Adds Optional Chaining and Null Coalescing

作者:Sergio De Simone
链接:https://www.infoq.cn/article/HbcGylHH727ofJmFm6lA

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:V8 8.0 JavaScript 引擎降低堆内存 40%,添加语言特性 Optional Chaining 和 Null Coalescing

链接:https://www.javascriptc.com/3709.html

« Wasmtime:终于可以在.NET 应用中运行 WebAssembly 了
Solandra 简介:TypeScript 优先的算法艺术框架»
Flutter 中文教程资源

相关推荐

QR code