V8发布v7.6

栏目: 后端 · 前端 · 发布时间: 5年前

V8发布v7.6

  • 原文:https://v8.dev/blog/v8-release-76

  • 译者:柴树杉(https://github.com/chai2010)

V8发布v7.6

每隔六周,V8将会创建一个新的发布分支。每个Chrome Beta里程碑之前的版本都是从V8的Git仓库master分支出来的。最近我们开了V8的v7.6分支,它将在未来的几周内和Chrome 76的stable版本正式发布前处于协同测试阶段。V8的v7.6版本为 码农 们带来了诸多友好的特性。

性能改进(大小和速度)

`JSON.parse`改进

在现代的JS应用中,通常使用JSON格式传输数据。如果能够加速JSON的解析,那么也可以加快通信的相应。在新版本中,JSON解析器有了重大提速,这使得一些主流页面提供的JSON数据提高了2.7倍。

V8发布v7.6

该图展示了 JSON.parse 在各大流行网站的性能提升。在V8 v7.5之前,JSON是采用递归解析,这导致解析器的堆栈深度和JSON嵌套深度存在相关性。而V8 v7.6改用非递归的迭代式解析,通过管理自己定制的栈,这可以可以降低内存的使用(从而提高性能)。

新的JSON解析内存使用也更加高效。在创建最终结果对象前,通过缓存对象属性数据可以优化内存的分配。对于有明确属性的输入数据,预先为命名属性分配空间(最多128个命名属性)。如果JSON对象保护所以属性名字,我们则预先分配一个备用缓存空间(可能是数组或字典)。JSON数组现在倍解析为符合输入数据中元素数量的数组。

Frozen/sealed数组的改进

对于Frozen/sealed数组(包括有着数组行为的对象),性能具有较大改进。V8 v7.6优化了以下JS代码的模式,其中frozen是Frozen/sealed数组。

  • frozen.indexOf(v)

  • frozen.includes(v)

  • 类似 fn(…frozen) 的传播使用

  • 嵌套数组传播调用 fn(…[…frozen])

  • apply方式调用 fn.apply(this, […frozen])

下图显示了这些改进:

V8发布v7.6

更多细节请参考(fast frozen & sealed elements in V8):https://bit.ly/fast-frozen-sealed-elements-in-v8

Unicode字符串

优化字符串到Unicode的转换,大幅提高了 String#localeCompareString#normalizeIntl 等函数的性能。例如,对于单子节的字符串, String#localeCompare 将速度提升了2倍。

JavaScript语言特性

`Promise.allSettled`

当全部的Promise被设置后, Promise.allSettled 提供一个信号,不管是成功或者失败。如果我们不关心最终的成功与否的状态,只是想知道合适完成了工作就比较方便。具体的例子可以看这里:https://v8.dev/features/promise-combinators

改进BigInt支持

BigInt在语言中已经有更好的API支持了。可以通过BigInt的toLocaleString方法,根据区域进行格式化。和普通数值一样使用:

12345678901234567890n.toLocaleString('en'); // :snail:
// → '12,345,678,901,234,567,890'
12345678901234567890n.toLocaleString('de'); // :snail:
// → '12.345.678.901.234.567.890'

如果希望用同样的区域格式化多个BigInt数字,可以使用 Intl.NumberFormat ,它支持 formatformatToParts 方法。这样可以用一个格式化器格式化多个数字:

const nf = new Intl.NumberFormat('fr');
nf.format(12345678901234567890n); // :rocket:
// → '12 345 678 901 234 567 890'
nf.formatToParts(123456n); // :rocket:
// → [
// →   { type: 'integer', value: '123' },
// →   { type: 'group', value: ' ' },
// →   { type: 'integer', value: '456' }
// → ]

`Intl.DateTimeFormat`改进

程序中经常需要显示时间段。比如订酒店订时候,需要跟进入驻时长进行计费。而 Intl.DateTimeFormat 提供了 formatRangeformatRangeToParts 方法,用于格式化时间段:

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' },
// → ]

此外, formatRangeformatRangeToParts 方法还新支持 timeStyledateStyle 选项:

const dtf = new Intl.DateTimeFormat('de', {
  timeStyle: 'medium',
  dateStyle: 'short'
});
dtf.format(Date.now());
// → '19.06.19, 13:33:37'

本地栈遍历

V8可以遍历它的栈(调试或性能分析的时候),但是Windows-x64系统下无法遍历TurboFan生成的代码。这会导致本季调试器或ETW采样会破坏堆栈。最新的V8可以通过注册必要的元谁,改进Windows-x64系统的栈遍历支持。而且在v7.6版本中已经默认启用了该特性。

V8 API

git log branch-heads/7.5..branch-heads/7.6 include/v8.h 命令可以获取变更列表。而Chrome Beta可以从这里下载:https://www.google.com/chrome/beta/

V8发布v7.6

V8发布v7.6


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Websites with Joomla!

Building Websites with Joomla!

H Graf / Packt Publishing / 2006-01-20 / USD 44.99

This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码