V8 发布 v8
V8 发布了 8.0 版本,此版本除了修复一些 bug,毫无疑问又带来了性能的提高。目前是预览,正式版将于几个星期后随 Chrome 80 Stable 一起发布。
性能改进
先看看性能改进,这包括内存占用减少与速度提升:
指针压缩
V8 堆包含整个项目所有东西,例如浮点值、字符串字符、编译的代码和标记值(tagged values),标记值代表指向 V8 堆的指针或小整型,开发团队发现这些标记值占据了堆的大部分空间。
标记值与系统指针一样大,对于 32 位架构来说,它们的宽度为 32 位,而在 64 位架构中,则为 64 位。在将 32 位版本与 64 位版本进行比较时,为每个标记值使用的堆内存是原来的两倍。
此版本通过一个方法减小了这一块内存:指针压缩。因为高位可以由低位合成,只需要将唯一的低位存储到堆中即可节省内存资源,经过测试,平均节省了 40% 的堆内存。
通常在减少内存的同时,也会牺牲速度性能,但是经过这一改进,V8 及其垃圾收集器中,都能够看到真实网站性能的提升。
优化高阶内置程序
此版本消除了 TurboFan 优化管道中的一个限制,该限制阻止了对高阶内置函数的优化。
const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt); charCodeAt(string, 8);
charCodeAt 对 TurboFan 的调用是完全不透明的,从而导致生成对用户定义函数的通用调用。通过此更改,现在可以识别出实际上是在调用内置 String.prototype.charCodeAt 函数,从而能够触发 TurboFan 库存中所有的进一步优化来改善对内置函数的调用,进而获得与以下代码相同的性能:
string.charCodeAt(8);
JavaScript
JavaScript 特性方面也有所变化,带来了两个新特性:
Optional Chaining
在编写属性访问链时,开发者经常需要检查中间值是否为空(null 或 undefined),这样可能会写出很冗长的显式错误检查链。
// Error prone-version, could throw. const nameLength = db.user.name.length; // Less error-prone, but harder to read. let nameLength; if (db && db.user && db.user.name) nameLength = db.user.name.length;
Optional Chaining(?.)使开发者可以编写更可靠的属性访问链,以检查中间值是否为空。如果中间值是空值,则整个表达式的计算结果为 undefined。
// Still checks for errors and is much more readable. const nameLength = db?.user?.name?.length;
同时,除了静态属性访问之外,Optional Chaining 还支持动态属性访问和调用。
null 合并(Nullish Coalescing)
另一个与 Optional Chaining 很接近的特性是 null 判断合并(Nullish Coalescing),由特定的 Nullish Coalescing 操作符 ?? 启用,它是一个新的短路二元运算符。
现在有时会使用逻辑 || 运算符处理默认值,例如:
function Component(props) { const enable = props.enabled || true; // … }
运算 a || b,当 a 为非真时结果为 b,如果 props.enabled 本身显式设置为“false”,那么这样的运算还是会得到第二个运算数“true”,也就是 enable = true。
现在使用 null 合并运算符 ??,当 a 为空,也就是 null 或者 undefined 时,a ?? b 的运算结果为 b,否则为 a,这样的默认值处理行为才是符合逻辑的,弥补了前边讲到的问题。
function Component(props) { const enable = props.enabled ?? true; // … }
同时,null 合并运算符和 Optional Chaining 是辅助功能,可以很好地协同工作。它们可以进一步处理上述示例中没有任何 props 参数传入的情况。
function Component(props) { const enable = props?.enabled ?? true; // … }
此外,API 有一些变化,可以通过以下方式查看:
git log branch-heads/7.9..branch-heads/8.0 include/v8.h
更新说明:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache Tomcat 8.5.50 发布
Apache Tomcat 8.5.50 发布了,8.5.x 替代了 8.0.x,并包含了一些从 9.0.x 分支而来的新特性,自 8.5.49 起,值得注意的变化包括: 更正静态资源缓存中与使用为缓存资源提供的 URL 有关的多个回归 Realm 接口和实现的改进 错误 bug,改进 CORS 过滤器 详情查看更新日志: http://tomcat.apache.org/tomcat-8.5-doc/changelog.html
- 下一篇
IntelliJ 平台 2020 年路线图
JetBrains 发文介绍了其 IntelliJ平台 2020 年的路线图。 文章主要介绍了当前 JetBrains 在改进 IntelliJ IDEA 和基于 IntelliJ 平台的 IDE 方面所做的一些工作,主要包括性能和对现代开发工作流的支持两个方面。改进结果将会在明年发布,其中一些会发布在春季的2020.1 版本中。 性能 索引性能 与 IDE 性能有关的两个主要痛点是启动性能,索引耗时较长的工具被认为是重量级的。JetBrains 表示,明年关注点将转向索引性能方面。 针对此问题官方采取了多管齐下的方法。首先,支持使用预建的索引块,这样每个用户 IntelliJ 实例都不必执行索引java.lang.String类的工作。计划明年逐步提供支持,从 JDK 开始,然后涵盖 Maven Central 的库以及其它 IDE 中的解释器和包。同时还在研究支持团队或企业内项目源代码的索引块共享的方法,虽然这一块目前还没有任何具体计划。 其次,计划通过在索引时提供更多的 IDE 操作来减少索引的破坏性。 第三,将检测并通知用户有关索引异常的信息,包括索引花费时间太长的文件、索引重...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16