V8发布v6.2
每六周,我们都会按照发布流程创建一个新的V8分支。每个版本都会在Chrome Beta里程碑之前直接从V8的Git主分支分支出来。今天我们很高兴地宣布我们的最新分支,V8版本6.2,它将在几周内随Chrome 62 Stable协调发布前处于测试阶段。V8 v6.2为开发者带来了各种各样的好东西。这篇文章提供了一些亮点的预览,以期待正式发布。
性能改进
Object#toString
的性能之前已被认定为一个潜在瓶颈,因为它经常被类似lodash和underscore.js这样的流行库和像AngularJS这样的框架使用。诸如_.isPlainObject
、_.isDate
、angular.isArrayBuffer
或angular.isRegExp
等各种辅助函数经常用于应用程序和库代码中执行运行时类型检查。
随着ES2015的出现,Object#toString
通过新的Symbol.toStringTag
符号可以被猴子补丁化,这也使得Object#toString
变得更为复杂、更难加速。在本次发布中,我们将最初在SpiderMonkey JavaScript引擎中实现的一项优化移植到V8中,大幅提高Object#toString
的吞吐量,性能提升达6.5倍。
它还对Speedometer浏览器基准测试特别是AngularJS子测试产生了影响,我们测得了3%的显著改进。阅读详细博客文章以获取更多信息。
我们还显著提高了ES2015代理的性能,将通过someProxy(params)
或new SomeOtherProxy(params)
调用代理对象的速度提升了最多5倍:
同样,通过someProxy.property
访问代理对象属性的性能也提高了近6.5倍:
这是一项正在进行的实习项目的一部分。敬请期待更详细的博客文章和最终结果。
我们还很高兴地宣布,由于Peter Wong的贡献,String#includes
内置函数的性能自上一个版本以来提高了超过3倍。
内部哈希表的哈希码查找速度大幅加快,从而提高了Map
、Set
、WeakMap
和WeakSet
的性能。一篇即将发布的博客文章将详细解释这一优化。
垃圾收集器现在使用并行收集器来收集堆的所谓年轻代。
增强的低内存模式
在过去的几个版本中,V8的低内存模式得到了增强(例如通过将初始半空间大小设置为512 KB)。低内存设备现在更少遇到内存不足的情况。然而,这种低内存行为可能对运行时性能产生负面影响。
更多的正则表达式功能
默认启用了正则表达式的dotAll
模式,通过s
标志启用。在dotAll
模式下,正则表达式中的.
原子可以匹配任意字符,包括行终止符。
/foo.bar/su.test('foo\nbar'); // true
后置断言,另一个新的正则表达式特性,现在默认可用。名称已经很好地描述了它的意义。后置断言提供了一种将模式限制为仅在其前面有后置组中指定模式时匹配的方法。它同时提供匹配和非匹配两种风味:
/(?<=\$)\d+/.exec('1美元约合¥123'); // ['1']
/(?<!\$)\d+/.exec('1美元约合¥123'); // ['123']
关于这些功能的更多详细信息,请参阅我们的博客文章即将到来的正则表达式功能。
模板字面量修订
根据相关提案,模板字面量中的转义序列限制已被放宽。这使得模板标签有了新的使用场景,例如编写一个LaTeX处理器。
const latex = (strings) => {
// …
};
const document = latex`
\newcommand{\fun}{\textbf{有趣!}}
\newcommand{\unicode}{\textbf{Unicode!}}
\newcommand{\xerxes}{\textbf{国王!}}
h上面的 breve 在 \u{h}处 // 非法标记!
`;
增加最大字符串长度
64位平台上的最大字符串长度从 2**28 - 16
增加到 2**30 - 25
个字符。
Full-codegen 已移除
在V8 v6.2中,旧的管道的最后几个主要部分已经移除。在此次发布中删除了超过30K行的代码——这是减少代码复杂性的一次显著胜利。
V8 API
请查看我们的API更改摘要。该文档在每次主要发布后会定期更新。
拥有活跃的V8检出版本的开发者可以使用 git checkout -b 6.2 -t branch-heads/6.2
来试验V8 v6.2中的新功能。或者,您可以订阅Chrome Beta频道,并很快亲自试用新功能。