-
原文:https://v8.dev/blog/v8-release-76
-
译者:柴树杉(https://github.com/chai2010)
每隔六周,V8将会创建一个新的发布分支。每个Chrome Beta里程碑之前的版本都是从V8的Git仓库master分支出来的。最近我们开了V8的v7.6分支,它将在未来的几周内和Chrome 76的stable版本正式发布前处于协同测试阶段。V8的v7.6版本为 码农 们带来了诸多友好的特性。
性能改进(大小和速度)
`JSON.parse`改进
在现代的JS应用中,通常使用JSON格式传输数据。如果能够加速JSON的解析,那么也可以加快通信的相应。在新版本中,JSON解析器有了重大提速,这使得一些主流页面提供的JSON数据提高了2.7倍。
该图展示了 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])
下图显示了这些改进:
更多细节请参考(fast frozen & sealed elements in V8):https://bit.ly/fast-frozen-sealed-elements-in-v8
Unicode字符串
优化字符串到Unicode的转换,大幅提高了 String#localeCompare 、 String#normalize 和 Intl 等函数的性能。例如,对于单子节的字符串, 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 ,它支持 format 和 formatToParts 方法。这样可以用一个格式化器格式化多个数字:
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 提供了 formatRange 和 formatRangeToParts 方法,用于格式化时间段:
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' },
// → ]
此外, formatRange 和 formatRangeToParts 方法还新支持 timeStyle 和 dateStyle 选项:
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/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- NPM包(模块)发布、更新、撤销发布
- 有赞灰度发布与蓝绿发布实践
- 【重磅发布】Linkis 0.10.0 版本发布
- BeetlSQL 3.0.9 发布,Idea 插件发布
- 贝密游戏 0.7.0 发布,发布斗地主
- 【重磅发布】DataSphere Studio 0.9.0 版本发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
About Face 4: 交互设计精髓
[美] 艾伦·库伯、[美] 罗伯特·莱曼、[美] 戴维·克罗宁、[美] 克里斯托弗·诺埃塞尔 / 倪卫国、刘松涛、杭敏、薛菲 / 电子工出版社 / 2015-10 / 118.00元
《About Face 4: 交互设计精髓》是《About Face 3:交互设计精髓》的升级版,此次升级把全书的结构重组优化,更加精练和易用;更新了一些适合当下时代的术语和实例,文字全部重新编译,更加清晰易读;增加了更多目标导向设计过程的细节,更新了现行实践,重点增加 移动和触屏平台交互设计,其实《About Face 4: 交互设计精髓》多数内容适用于多种平台。 《About F......一起来看看 《About Face 4: 交互设计精髓》 这本书的介绍吧!