V8 Release 版本内容汇总

简介

V8 引擎相关内容。

xmind:

V8 release v7.6

性能(Performance, size & speed)

JSON.parse 性能提升

在现代 JavaScript 应用中, JSON 以用来传递数组最常用的格式。

通过加速 JSON 的解析,我们可以减少数据通信之间的一些潜在风险。

在 V8 v7.6 中,对 JSON 解析器进行了大量修改,从而使 JSON 的扫描和解析更加快速。

下面是 v7.6 vs v7.5 的解析速度比较图:

img

在 v7.5 版本及之前, JSON 解析器有一个递归解析器(recursive parser),它相对于深层嵌套的 JSON 数据,会用到本地的堆栈空间。

这意味着如果嵌套层次太深,将有可能导致堆栈溢出,导致程序崩溃。

在 v7.6 版本中,将递归解析器切换成了迭代解析器(iterative parser),它将有能力管理它自己的堆栈,并且这个堆栈空间有大小的限制,而不是无限制

的使用,从而避免程序内存溢出导致崩溃。

新的迭代解析器也能高效地使用内存,通过在创建最终对象之前将属性进行缓存,从而让我们可以决定如何以最优的方式去

存储解析后的结果。

  1. 对于带有命名属性的对象(最高能有 128 个命名属性),我们将以所需要的精确的内存去存储他们。

  2. 对于包含索引值作为属性名的对象,我们将以尽可能小的空间去存储,比如:数组或字典的方式存储。

  3. 对于 JSON 数组,现在会被解析到一个数组中,精确的匹配来源数据中的索引值对应的每一项。

Frozen/sealed 数组性能提升

v7.6 对 frozen 和 sealed 数组的调用,做了许多性能上的提升。

比如,下面使用 frozen 和 sealed 数组的场景:

  • frozen.idnexOf(v)
  • frozen.includes(v)
  • fn(...frozen)
  • fn(...[...frozen])
  • fn.apply(this, [...frozen])

性能比较图:

img

详细内容 ->

Unicode 字符串操作

优化了一些接口的调用,需要使用到字符串转 Unicode 的时的性能。

JavaScript 语言特性

Promise.allSettled

Promise.allSettled(promises) 提供了一个信号,该信号表示所有的 promises 的状态都已经完成,

不论是 fullfilled 或者 rejected

这对于你无须关心每个 promise 的状态的时候将会很有用,你只需要知道这些 promises 是什么时候完成的,而

无须关心它是成功或失败。

Object.preventExtensions()

不允许对象进行扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
const obj = {

}

Object.preventExtensions(obj)

try {
Object.defineProperty(obj, 'age', {
value: 100
})
} catch (e) {
console.log(e.message)
}

+RESULTS:

Cannot define property age, object is not extensible

BigInt 支持

BigInt 现有有了更好的 API 支持。

现在可以通过 toLocaleString 方法将一个 BigInt 数值转成一个字符串。

1
2
3
4
console.log(12345678901234567890n.toLocaleString('en')); // 🐌
// → '12,345,678,901,234,567,890'
console.log(12345678901234567890n.toLocaleString('de')); // 🐌
// → '12.345.678.901.234.567.890'

+RESULTS:

12345678901234567890
12345678901234567890

如果想用同一种方式去格式化一个很大的数或者一个 BigInt 数,使用 Intl.NumberFormat 这个 API

将会是更好的选择,它现在开始支持将 BigInt 使用 formatformatToParts 方法,格式化成

想要的格式,使用这种方式,你可以创建一个可服用的格式化实例。

1
2
3
4
5
6
7
8
9
const nf = new Intl.NumberFormat('fr');
nf.format(12345678901234567890n); // 🚀
// → '12 345 678 901 234 567 890'
nf.formatToParts(123456n); // 🚀
// → [
// → { type: 'integer', value: '123' },
// → { type: 'group', value: ' ' },
// → { type: 'integer', value: '456' }
// → ]

Intl.DateTimeFormat 提升

应用中经常会用到 Date 去间隔性的或者范围性的去显示时间日期,用来计算一些时间数据,记录一些事件触发

的开始和结束时间,比如酒店客房的约定起始和结束时间,一首音乐播放的开始和结束等等。

Intl.DateTimeFormat 如今可以支持 fromatRangeformatRangeToParts 两种方式,将很方便的将日期

范围格式化成一种特定的格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const start = new Date('2019-05-07T09:20:00');
// → 'May 7, 2019'
const end = new Date('2019-05-09T16:00:00');
// → 'May 9, 2019'
const fmt = new Intl.DateTimeFormat('en', {
year: 'numeric',
month: 'long',
day: 'numeric',
});
const output = fmt.formatRange(start, end);
// → 'May 7 – 9, 2019'
const parts = fmt.formatRangeToParts(start, end);
// → [
// → { 'type': 'month', 'value': 'May', 'source': 'shared' },
// → { 'type': 'literal', 'value': ' ', 'source': 'shared' },
// → { 'type': 'day', 'value': '7', 'source': 'startRange' },
// → { 'type': 'literal', 'value': ' – ', 'source': 'shared' },
// → { 'type': 'day', 'value': '9', 'source': 'endRange' },
// → { 'type': 'literal', 'value': ', ', 'source': 'shared' },
// → { 'type': 'year', 'value': '2019', 'source': 'shared' },
// → ]

另外 format, formatToParts, 和 formatRangeToParts 方法现在开始支持新的

timeStyledateStyle 选项。

本地堆栈遍历(Native stack walking)

当 V8 可以遍历自己的调用栈的时候(比如,在 debugging 或 profiling 的时候),

运行在 x64 架构上的 Windows 系统没法去遍历一个包含 TurboFan 生成的代码的调用栈。

这将会导致在使用本地 debugger 或者 ETW 分析的时候程序崩溃。

最新的改动将是 V8 会为 Windows 注册必要的元数据(register the necessary metadata)

从而使其在 x64 架构上具备遍历这些栈的能力(v7.6 默认开启这种能力)

V8 API

V8 depottools

depottools - A collection of tools for dealing with Chromium development.

Chromuim 开发工具集合。

https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html

本文标题:V8 Release 版本内容汇总

文章作者:ZhiCheng Lee

发布时间:2019年06月24日 - 10:23:30

最后更新:2019年06月28日 - 09:53:22

原始链接:http://blog.gcl666.com/2019/06/24/v8_release/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%