火星科技网您的位置:首页 >互联网+ >

Cloudflare支持的BinaryAST承诺显着加快JavaScript应用程序的速度

导读 你不能想象的事情:一些JavaScript web应用程序是相当缓慢的,由于严重的高压启动,解析和数据传输的开销。根据HTTPArchive,它定期抓取热

你不能想象的事情:一些JavaScript web应用程序是相当缓慢的,由于严重的高压启动,解析和数据传输的开销。根据HTTPArchive,它定期抓取热门网站并记录有关获取资源的信息,平均页面需要350KB的JavaScript(10%的页面超过1MB)。一旦这些页面被传输,JavaScript引擎必须检查语法错误并编译它们(假设它们没有被缓存)。对于高端移动设备上的1MB文件,或者普通手机上的1MB文件,大约需要100毫秒。

一个解决方案可能在于BinaryAST,这是Mozilla提出的一种新的“线上”JavaScript格式(在Facebook,Bloomberg和其他人的支持下),旨在加速解析,同时保留JavaScript的原始语义。怎么样?通过对代码和数据结构使用有效的二进制表示,并通过提前存储和向解析器提供指导信息。虽然格式仍然有些不稳定,但客户的第一个版本几个月前在FirefoxNightly的旗帜下发布,内容交付服务Cloudflare最近成为首批在其Cloudflare Workers中提供必要的云托管JavaScript引擎的服务器之一执行环境。

因此,只要能快多少是BinaryAST?在测试中,Mozilla在台式机(BinaryAST)上测量了3.3MB Javascript应用程序的加载时间为476毫秒(677毫秒),在HTC One M8等智能手机上测量了2,794毫秒,而3,579毫秒。此外,Mozilla已将解析时间改进记录在90-97%之间。

传统上,浏览器将JavaScript解析为称为抽象语法树(AST)的中间表示,描述运行代码的步骤,然后将其编译为机器代码或发送到即时(JIT)编译器以在客户端执行。BinaryAST使得只能解析启动所需的代码,而不是整个文件,从而减少了浏览器解析器必须执行的总工作量。

这是如何做:

JavaScript依赖于提升声明(即变量,函数和类),这允许开发人员在语法使用之后声明项目。BinaryAST通过在表达式之前预先提供所有范围信息来存储它们。

现代浏览器引擎使用延迟解析,其中一些函数被预先准备,跳过或延迟,而不是通过抽象语法树完全解析。通常,这需要为每个函数体提供手工启发式,但是使用BinaryAST,浏览器解析器可以依赖于已经过分析和验证的JavaScript,因此完全跳过函数体。这使得延迟解析有效地“免费”。

在源运行实际解析器之前,会对源运行一类称为“早期错误”的错误,以检查无效上下文中的保留字,严格模式违规和变量名冲突等错误。BinaryAST可以在运行之前提前发现这些错误。

解析低级类型(如文本中的数字)需要额外的计算,并且在完全解析之前(通过回溯或使用中间节点类型),某些函数是不明确的。BinaryAST在解析之前预先暴露节点类型。

由Cloudflare和Mozilla实现的当前BinaryAST原型通过解析器运行JavaScript源以生成AST,编码器(以Rust和完全本机编写)在以多种支持格式之一写出结果之前进行注释。在Cloudflare Workers中,本机Rust编码器被编译为WebAssemly(基于堆栈的虚拟机的二进制指令格式),运行JavaScript解析器代码的Node.js实例将根据需要在相同的进程中进行旋转。

Mozilla说,通过直接从JavaScript AST检索所需的位来减少开销数据传输,CPU开销和内存使用,这样所有本机类型的AST结构都可以使用解串器直接从Node.js进程以流方式进行反序列化。此外,此反序列化程序可以使用其Rust类型的知识,并将所有序列化的属性名称作为JavaScript值句柄缓存一次,并重用它们以进行进一步的属性访问,从而再次提高性能。

想要开始使用BinaryAST?你很幸运 - BinaryAST Worker可以安装在任何Cloudflare网站上。配置完成后,每晚下载Firefox,前往about:config页面,启用不受限制的BinaryAST即可启动并运行。

标签:

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如有侵权行为,请第一时间联系我们修改或删除,多谢。