V8 7.x-8.x主要性能提升

最新chrome版本

Chrome:87.0.4280.66 (正式版本) (64 位) (cohort: 87_66_Win)

修订版本:fd98a29dd59b36f71e4741332c9ad5bda42094bf-refs/branch-heads/4280@{#1432}

操作系统:Windows 10 OS Version 1909 (Build 18363.1198)

JavaScript:V8 8.7.220.25

在这里插入图片描述
从Chrome40以后的版本开始,设置了V8引擎的版本一直跟随Chrome浏览器的版本。

每6星期发布一个大版本

一年发布8个版本

最近两个大版本的发布时间

8.78.68.58.48.38.18.0
2020/10/232020/9/212020/7/212020/6/302020/5/42020/2/252019/12/18
7.97.87.77.67.57.4
2019/11/202019/9/272019/8/132019/6/192019/5/162019/3/22

Node.js大版本对应V8版本

Nodejs.js对应V8版本V8新特性
15.x8.6性能提升,新的语言特性:Promise.any(), AggregateError, String.prototype.replaceAll()
14.15.0 LTS8.4WebAssembly性能提升,better debugging
14.x8.1+Optional Chaining, Nullish, Intl.DisplayNames…
13.x7.8+regexp编译速度和内存占用优化
12.x7.4+性能提升和改进

8.7

与Chrome 87 Stable协同发布,最新版本2020.10.23

  • Unsafe fast JS calls
  • Atomics.waitAsync

8.6

优化 Number.prototype.toString

通常将JavaScript数字转换为字符串可能会非常复杂,必须考虑浮点精度,科学计数法,NaN,无穷大,舍入等,但是大多数时候只是为了输出一个小数,并不需要调用Number.prototype.toString函数,这一函数的开销很大,该版本
Number.prototype.toString编写了一个小整数的简单快速路径,以减少这种常见情况的开销。这样可将数字印刷微基准(number printing microbenchmarks)提高约75%。

WebAssembly

SIMD on Liftoff

Liftoff是WebAssembly的basic编译器,在V8.5之前已经全部支持,SIMD proposal使WebAssembly采取常用硬件矢量指令的优势,加快计算密集型工作负载。

目前SIMD仅在V8的top编译器,TurboFan中实现,以Liftoff标量实现作为基准,对比结果如下:
在这里插入图片描述

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

8.4

WebAssembly

  • Improved start-up time
    WebAssembly的基准编译器Liftoff支持原子指令和大容量存储器操作,加快了启动速度。
  • Better debugging
    改善了WebAssembly的调试体验,执行速度降低了100被,性能损失三分之一。
  • SIMD Origin Trial
    可以利用常用的硬件矢量指令来加速计算密集型工作负载。

8.0

性能

指针压缩

V8 引擎的这次更新,对内存占用量与速度都进行了优化。V8 堆包含了很多东西,例如浮点值、字符串字符、编译代码以及标定值,开发团队发现这些标记值占据了堆的很大一部分空间。标定值与系统指针一样大,32 位宽度对应 32 位架构,64 位宽度对应 64 位架构。当开发团队对比 32 位版本与 64 位版本时发现,每个标记值使用了两倍的堆内存。因为高位可以由低位合成,所以只需要将唯一的低位存储到堆中就能实现降低内存的占用量,平均可节省 40% 堆内存。
在这里插入图片描述

而且压缩内存并未影响性能,V8整体的时间和垃圾收集器(GC)性能都有改进。
在这里插入图片描述

7.x

7.9 OSR caching

V8识别出某些功能很hot的时候,会进行标记,下次调用时进行优化。基准性能提高5-18%

7.8 regexp性能优化
7.6 与JSON.parse相关的更新,解析速度提高了2.7

V8 v7.5 之前,JSON 解析器是一个递归解析器,它的原生堆栈空间受传入 JSON 数据的嵌套深度影响,这意味着可以在非常深层嵌套的 JSON 数据中用尽堆栈空间。V8 v7.6 把它改成了一个迭代解析器,现在管理自己的堆栈,堆栈仅受可用内存的限制。另一方面,新的 JSON 解析器也更具内存效率,通过在创建最终对象之前缓冲属性,现在可以决定如何以最佳方式分配结果。
在这里插入图片描述

7.6 改进frozen/sealed数组
对 frozen 与 sealed 数组(以及类似数组的对象)的调用性能得到提升。
7.4 为参数不匹配的调用提供了更快的调用速度。

V8 7.4通过arguments适配器提供了对实际参数的访问,减少了60%的调用开销。

JavaScript 中允许调用函数时参数的数量与定义时不同的情况,不管是参数少了还是多了都完全有效,同时 JavaScript 函数可以通过参数对象、rest 参数等方式获取实际参数。因此,JavaScript 引擎中必须提供一种获取实际参数的方法,在 V8 中,这是通过一种称为参数自适应的技术完成的。

参数自适应可以获取实际参数,但却是以性能为代价的,而这种性能损耗在现代前端和中间件框架中通常是没法避免的,因为有太多 API 具有可选参数或可变参数列表了。

V8 7.4 版本中带来了一项新特性解决了这一问题。在某些情况下,比如当被调用的是严格模式的函数时,既不使用参数也不使用 rest 参数,这时候就完全不需要去进行参数自适应。

现在 V8 在这种情况下就直接跳过这一自适应过程,将调用开销减少了超过 60%。

7.4 改进了解释器的脚本性能,平均提高了8%的解析速度
7.4 内存减少

从 JavaScript 源码编译的字节码占据了很大一部分 V8 堆空间,通常约为 15%,包括相关的元数据。但是有许多函数只在初始化期间执行,或者在编译后很少使用,这显然是一种浪费。为了减少 V8 的内存开销,此版本实现了一项字节码 flush 新功能,即如果已编译的字节码最近没有被执行,那么在 GC 期间将从函数中将其清除。

该字节码 flush 功能为 Chrome 用户节省了大量内存,将 V8 堆中的内存量减少了 5-15%,同时不会降低性能或显着增加编译 JavaScript 代码所花费的 CPU 时间。

7.4 增加了WebAssembly特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值