很多人认为WebAssembly是一种可能改变游戏规则的技术,因为它可以使代码在Web上运行得更快。目前已经有了一些 WebAssembly加速技术,还有一些加速方案即将出现。
其中一种加速技术就是流式编译,即允许代码一边下载,浏览器一边编译。直到现在(原作者写此文时,Firxfox 58还未发布),流式编译还是一种潜在的加速技术,随着Firefox 58版本的发布,这种技术变成了现实。
Firefox 58中的另一种新的机制是引入了新的两层编译器,即baseline编译器和优化编译器。其中baseline编译器的代码编译速度比优化编译器快10-15倍。
流式编译和分层编译器结合起来意味着代码编译的速度比从网络中下载还要快。
在PC机上,编译WebAssembly的速度可以达到30-60兆字节/秒,这比在网络中传送数据包的速度还要快。
使用Firefox Nightly或Beta版本,你可以在自己的设备上进行一下测试,即使是在平均性能的移动设备上,编译速度也可以达到8兆字节/秒——这几乎比所有移动网络的平均下载速度还要快。
为什么这很重要
Web性能倡导者认为当页面中包含大量JavaScript时,JavaScript的下载会导致页面的加载速度变慢。
这主要是因为解析和编译时间。Steve Souders指出,Web性能曾经的瓶颈在于网络,而如今Web性能的新瓶颈是CPU以及主线程的执行速度。
因此我们希望尽可能地将更多的工作从主线程分离出来,而且越早越好以便充分利用所有的CPU时间,更进一步,希望CPU做更少的工作。
使用JavaScript,可以做到一些,比如当数据包下载的过程中,可以在其他线程中解析JS,解析操作不可避免且有较大的工作量,另外需要等待解析完成才能开始编译。为了编译,又得切回到主线程,因为JavaScript往往是在运行时编译。