最新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.7 | 8.6 | 8.5 | 8.4 | 8.3 | 8.1 | 8.0 |
---|---|---|---|---|---|---|
2020/10/23 | 2020/9/21 | 2020/7/21 | 2020/6/30 | 2020/5/4 | 2020/2/25 | 2019/12/18 |
7.9 | 7.8 | 7.7 | 7.6 | 7.5 | 7.4 |
---|---|---|---|---|---|
2019/11/20 | 2019/9/27 | 2019/8/13 | 2019/6/19 | 2019/5/16 | 2019/3/22 |
Node.js大版本对应V8版本
Nodejs.js | 对应V8版本 | V8新特性 |
---|---|---|
15.x | 8.6 | 性能提升,新的语言特性:Promise.any(), AggregateError, String.prototype.replaceAll() |
14.15.0 LTS | 8.4 | WebAssembly性能提升,better debugging |
14.x | 8.1+ | Optional Chaining, Nullish, Intl.DisplayNames… |
13.x | 7.8+ | regexp编译速度和内存占用优化 |
12.x | 7.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 时间。