WebAssembly执行速度真的很强悍吗?对微软Edge很无语
Firefox一直在WebAssembly上耕耘,在macOS与Windows上表现的都很好,Chrome 67在WebAssembly执行速度没有特别突出,甚至在macOS上还输给Javascript,而Safari与Edge则让人有点惊讶。
为解决网页应用程序的的原罪,WebAssembly一直被视为救星,那实际使用的状况如何呢?提供网页PDF SDK的PSPDFKit为此做了实际测试,发现结果跟预期很不一样,执行速度依浏览器以及操作系统不同而有很大的差异,唯有Firefox无论是在macOS或是Windows,执行WebAssembly速度都远快于Javascript外,其他差异不大甚至还发生慢上许多的情况。PSPDFKit也将测试网页发布,供测试。
PSPDFKit在2016年发布了他们第一个网页SDK,而这是一个需要依赖服务器组建来渲染文件的方法,因此当他们了解利用WebAssembly,能让浏览器直接处理完所有渲染工作,不需要后端基础设施,于是在积极研究下几个月后,他们发布了基于WebAssembly的PSPDFKit网页版本,以大幅降低客户的使用障碍。
PSPDFKit网页开发人员Philipp Spiess提到,渲染PDF是一件复杂的事,除了PDF是一个存在25年的格式外,其中还有许多情况需要处理,总共需要约50万行的C++程序码来完成PDF渲染工作。但要将这些C++程序代码完全移植到JavaScript成本太高,他提到PSPDFKit不可能这么做,而WebAssembly和asm.js等技术,允许他们在浏览器中使用相同的程序码基础,将C++程序代码转成WebAssembly程序,由浏览器快速渲染PDF文档。
由于服务建构在WebAssembly基础上,他们对于WebAssembly的执行性能非常在意,因此PSPDFKit对此进行了多浏览器多平台的测试。他们想透过这个测试了解渲染情况,来提高网页版PSPDFKit的执行性能,因此Philipp Spiess强调,这个测试讲究应用程序实际执行的情况,测试得到的分数越低越好。
他还提到,用于测试的应用程序不会直接调用WebAssembly,反而还要先测试与之通讯的桥接部分,这样才符合网页版PSPDFKit实际执行状况。此外,这个测试还停用了WebAssembly的串流编译功能,Philipp Spiess表示,这项功能让WebAssembly和JavaScript-fallback1难以比较,因为JavaScript无法使用一边串流同时编译的最佳化,为了让测试简单易于比较,因此暂时停用了这项功能。
PSPDFKit在macOS与Windows两大操作系统,测试了Chrome、Firefox、Safari和Edge四大热门浏览器。结果显示Firefox在两个操作系统执行WebAssembly性能都是最好的,在macOS中,WebAssembly的执行性能分数1902,而JavaScript-fallback1则是6855(分数愈低愈好),而在Windows中则是1300比4424,效率约快上3.5倍。
Philipp Spiess解释,Firefox之所以测试结果可以这么好,是因为采用了分层编译以及IndexedDB存储器。同时Firefox也给了PSPDFKit建议,在初始编译时,浏览器基准编译器(Baseline Compiler)启动会比较慢,因此应该避免在第一次启动时,在环境执行太多工作进程。
Chrome的情况则比较复杂一些,Chrome 67与Chrome 69金丝雀版本表现有些差异,在macOS中,Chrome 67执行WebAssembly分数5408略输JavaScript-fallback1的4784,而Windows中WebAssembly分数3129则小赢JavaScript-fallback1的3373。
Philipp Spiess认为,Chrome的WebAssembly的执行性能一直以来比现不错,但其V8引擎放弃为WebAssembly采用IndexedDB存储器稍微可惜。不过,官方表示他们将在Chrome 69更新基准编译器,因此Chrome 69加入测试后,无论在macOS或是Windows的WebAssembly执行性能皆获提升,且于macOS平台由输转赢。
值得注意的是,Safari即便在主场macOS上,WebAssembly的测试分数却高达8382,执行速度低于JavaScript-fallback1的5802,在PSPDFKit与苹果合作追踪问题后,发现Safari存在一个bug严重影响WebAssembly的表现,官方表示在修正后速度已经获得提升,但没有详述分数。
如图,吸引眼球的项目则是微软力推的Edge,WebAssembly在Windows的执行表现分数破万11362,远高于JavaScript-fallback1的7315,即便Edge执行Javascript的速度也比其他竞争平台慢2倍。