All Articles

V8 Blog | V8 release v6.5 2018-02-01

1. 原文

V8 release v6.5

2. 摘要翻译

Untrusted code mode

为了响应最近被称为Spectre的攻击,V8引入了untrusted code mode。如果你嵌入了V8,请考虑在处理用户生成的、未经信任的代码的时候利用该模式。请记住,该模式是默认启动的,即便是在Chrome当中。

Streaming compilation for WebAssembly code

WebAssembly API提供了一个特殊的函数来支持和fetch() API组合流式编译WebAssembly代码:

const module = await WebAssembly.compileStreaming(fetch('foo.wasm'));

该API自V8 6.1和Chrome 61开始可用,虽然最初的实现版本并没有真的实现流式编译。然后,自V8 6.5和Chrome 65我们开始真正利用该API来编译仍旧在下载中的WebAssembly模块。一旦我们接收到完整的单个函数,就会发送到一个后台线程去编译。

我们的测试显示,结合了这个API在Chrome 65中,WebAssembly编译速度在高端机型上能追上最高高达50 Mbit/sec的下载速度。这意味着如果你以50 Mbit/sec速度下载WebAssembly代码,代码编译会在下载完成之后即刻完成。

下图中,我们记录了76M尺寸的WebAssembly模块(大约190000个函数)的下载和编译时长。我们测试了25 Mbit/sec、50 Mbit/sec和100 Mbit/sec三种速度。

当下载时长长于编译时长,例如图中下载速度为25 Mbit/sec和50 Mbit/sec的情况,WebAssembly.compileStreaming()都几乎是在下载完成之后即刻就完成了编译工作。

当下载时长短于编译时长,WebAssembly.compileStreaming()编译的耗时和没有下载的情况一致(文件存储在本地)。

Speed

我们持续拓展着JavaScript内建模块的fast-path,添加了一个侦测和防范被称为deoptimization loop的毁灭性情况的机制。当你的优化后的代码重新deoptimize时该情况发生了,而且没有方法能够获知事情已经出了问题。在这种场景下,TurboFan仅仅只是尝试不停重新优化代码,最后在30次尝试之后放弃。当你编写的代码尝试在任何second order array builtins的回调函数中修改the shape of the array时候就会发生。例如,修改数组的长度 —— 在v6.5版本中,我们会侦测到该问题的发生,并停止内联该内建数组在该站点上的调用的后续优化尝试。

我们同样也在通过内联许多之前因加载函数去调用(the load of the function to call)和调用本身(the call itself)之间的副作用(例如函数调用 for example a function call)而被摒除在外的内建模块来拓展fast-path。此外,函数调用中的String.prototype.indexOf获得了10倍的性能提升(10× performance improvement)。

在v6.4版本中,我们已经内联了对Array.prototype.forEach、Array.prototype.map和Array.prototype.filter的支持。在v6.5中,我们添加了对以下几个的支持:

  • Array.prototype.reduce
  • Array.prototype.reduceRight
  • Array.prototype.find
  • Array.prototype.findIndex
  • Array.prototype.some
  • Array.prototype.every

此外,我们拓展了上述列表中所有的fast-path。最初,我们是想帮助下混有浮点数字的数组,甚至是混有空洞在内的数组,e.g. [3, 4.5, , 6]。现在,我们能处理好除了findfindIndex之外的任何含洞的浮点数字数组,虽然spec requirement中是要求将空洞转成undefined(where the spec requirement to convert holes into undefined throws a monkey-wrench into our efforts (for now…!))。

下图显示了与V8 6.4版本相比较,内联的内建模块的性能提升,分为几列:integer arrays、double arrays以及double arrays with holes。时间单位是毫秒。

V8 API

请使用git log branch-heads/6.4..branch-heads/6.5 include/v8.h来获得API改动的列表。

EOF

Published 2018/3/22

Some tech & personal blog posts