AICon全球人工智能与机器学习技术大会8折特惠,购票立减¥960! 了解详情
写点什么

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

2020 年 1 月 09 日

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


2020 年 1 月 09 日 09:002100

评论

发布
暂无评论
发现更多内容

帆软授权失效处理

Flychen

spring-boot-route(二十)Spring Task实现简单定时任务

Java旅途

Java Spring Boot Spring Task

MySQL-技术专题-联合索引最左前缀匹配原则

李浩宇/Alex

微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

AI乔治

Java 架构 微服务 ,docker

go-zero 如何应对海量定时/延迟任务?

万俊峰Kevin

golang 定时任务 时间轮 microservice 延迟任务

深度详解企业CRM系统,体验软件快速开发平台

Marilyn

敏捷开发 快速开发 CRM

目标2025:通信产业在能源变局中拥抱智能未来

脑极体

架构师第一期作业(第5周)

Cheer

作业

云原生在京东丨基于 Tekton 打造下一代云原生 CI 平台

京东科技开发者

ci 云原生 Tekton

sync-player:使用websocket实现异地同步播放视频

GoEasy消息推送

websocket 数据同步 实时通信

据说99.99%的人都会答错的类加载的问题

AI乔治

Java 架构 JVM 类加载 性能调优

最新版MySQL在MacOS上的安装与使用

王磊

MySQL

java安全编码指南之:ThreadPool的使用

程序那些事

java安全编码 java编码指南 java安全编码指南 java代码规范

在算力“沃土”上,种植互联网下一个奇迹十年

脑极体

架构师的成长之路

华章IT

CTO 架构师 架构师之道

LAXCUS大数据集群操作系统:一个分布式分时共享E级系统软件(四)

陈泽云

人工智能 大数据 数据结构 操作系统 数据存储

手把手带你玩转 openEuler | openEuler 的使用

openEuler

操作系统 openEuler

APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!

程序员小航

Java bug Header携带签名 工作笔记 问题排查

关注你自己,如同篮球巨星一样,让身体最佳化,持续投入最爱的事情。

叶小鍵

健康 科普 王立铭 肥胖

黄金圈法则:成功者必备的深度思考方法

陆陆通通

黄金圈法则 厉害 牛逼

速度(Velocity)不背这个锅

BY林子

敏捷开发 估算与计划

iOS底层原理之—dyld与objc的关联

iOSer

ios开发 iOS Developer dyld objc

MySQL-技术专题-聚集索引和慢查询

李浩宇/Alex

忘记MySQL密码怎么办?一招教你搞定!

王磊

MySQL

金九银十期间成功斩获58万架构师Offer!六面字节跳动面经和面试题分享

Java架构追梦

Java 学习 架构 面试 JVM

甲方日常 33

句子

工作 随笔杂谈 日常

Java Reference核心原理分析

AI乔治

Java 架构 JVM 性能调优

十八、深入Python函数

刘润森

Python

第12周学习总结

Vincent

极客时间 极客大学

计算机网络基础知识总结

cxuan

计算机网络 计算机

Servlet-技术专题-Servlet3异步原理与实践

李浩宇/Alex

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