每隔六周,我们就会创建一个新的V8分支,作为发布过程的一部分。每个版本都是在Chrome Beta里程碑之前从V8的Git主版本分支而来的。今天,我们很高兴地宣布我们的最新分支,V8版本8.6,它是测试版,直到它与Chrome86协同发布,几周后就会稳定下来。V8V8.6充满了各种面向开发人员的好东西。这篇帖子提供了一些期待发布的亮点的预览。V8.6版本使V8代码库更受尊重。该团队加入了一项Chromium范围的努力,通过替换项目中的一些不敏感的条款,来遵守谷歌对种族平等的承诺。这仍然是一项持续的努力,欢迎任何外部贡献者伸出援手!您可以在此处看到仍然可用的任务列表。JS-Fuzzer是一个基于突变的JavaScript Fuzzer,最初由Oliver Chang编写。它在过去一直是V8稳定性和安全性的基石,现在是开源的。Fuzzer使用由可扩展赋值器类配置的Babel AST转换来变异现有的跨引擎测试用例。我们最近还开始在差异测试模式下运行Fuzzer的一个实例,以检测JavaScript正确性问题。欢迎投稿!有关更多信息,请参阅自述文件。在一般情况下,将JavaScript数字转换为字符串可能是一个令人惊讶的复杂操作;我们必须考虑浮点精度、科学记数法、nans、无穷大、舍入等等。在计算之前,我们甚至不知道结果字符串会有多大。正因为如此,我们的Number.Prototype.toString实现将跳出到C++运行时函数。但是,很多时候,您只想打印一个简单的小整数(“SMI”)。这是一个简单得多的操作,调用C++运行时函数的开销不再值得。因此,我们与微软的朋友合作,为用TORQUE编写的Number.Prototype.toString添加了一条用于小整数的简单快速路径,以减少这种常见情况下的开销。这将数字打印微基准提高了约75%。为了与V7.3中的规范更改相匹配,Atomics.wake被重命名为Atomics.Notify。不推荐使用的Atomics.wake别名现在已删除。匿名类现在有一个.name属性,它的值是空字符串";";。规格更改。现在,在松散模式下的模板字符串文字和严格模式下的所有字符串文字中,\8和\9转义序列都是非法的。规格更改。内置反射对象现在有一个Symbol.toStringTag属性,其值为";Reflect";。规格更改。
Liftoff是WebAssembly的基准编译器,从V8V8.5开始,所有平台上都附带了Liftoff。SIMD提案使WebAssembly能够利用常用的硬件矢量指令来加速计算密集型工作负载。它目前处于Origin试验阶段,允许开发人员在功能标准化之前对其进行试验。到目前为止,SIMD只在Turbofan中实现,Turbofan是V8的顶级编译器。这对于获得SIMD指令的最高性能是必要的。既然SIMD也是在Liftff中实现的,那么您将能够在Liftff中调试SIMD代码,其性能比WebAssembly解释器要好得多。使用SIMD指令的WebAssembly模块也将具有更快的启动速度,并且通常比用turbofan编译的标量等效物的运行时性能更快。例如,给定一个函数,该函数采用浮点数组并将其值钳制为零(为清楚起见,此处使用JavaScript编写):函数clipZero(F32array){for(设i=0;i<;f32array.length;++i){if(f32array[i]<;0){f32array[i]=0;}。
让我们使用Liftoff和turbofan来比较该函数的两种不同实现:使用Liftoff标量实现作为基准,我们将看到以下结果:如果WebAssembly调用导入的JavaScript函数,我们将通过所谓的“Wasm-to-JS包装器”(或“导入包装器”)进行调用。此包装器将参数转换为JavaScript能够理解的对象,当对JavaScript的调用返回时,它将返回值转换回WebAssembly。为了确保JavaScript Arguments对象准确反映从WebAssembly传递的参数,如果检测到参数数量不匹配,则通过所谓的“Arguments适配器蹦床”进行调用。但在许多情况下,这并不是必需的,因为被调用的函数不使用Arguments对象。在V8.6中,我们由我们的Microsoft贡献者提供了一个补丁,在这些情况下避免了通过参数适配器进行调用,这使得受影响的调用速度大大加快。新的API函数Isolate::HasPendingBackround Tasks允许嵌入者检查是否存在最终将发布新的前台任务的挂起的后台工作,如WebAs