使用WebAssembly来加速Web

Posted ArkTeam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用WebAssembly来加速Web相关的知识,希望对你有一定的参考价值。

原文标题:Bringing the Web up to Speed with WebAssembly

原文会议:PLDI 2017

原文链接:https://pldi17.sigplan.org/event/pldi-2017-papers-bringing-the-web-up-to-speed-with-webassembly

可下载链接:https://dl.acm.org/citation.cfm?id=3062363

Web平台的成熟引发了复杂和性能要求苛刻的Web应用程序,如交互式3D可视化,音频和视频软件以及游戏。因此,Web平台上代码的高效性和安全性变得越来越重要。然而,javascript作为Web平台(浏览器)唯一内置的语言,并不能很好地满足上述需求。

来自四大浏览器供应商(Google, Mozilla, Microsoft, Apple)的工程师已经面对这一挑战,合作设计了一个名为WebAssembly的可移植的底层字节码。它提供严谨的格式、有效的验证和编译、低或无开销安全执行。WebAssembly不针对特定的编程模型,而是对现代硬件的一层抽象,这使得WebAssembly和语言、硬件、平台无关,其平台也不仅仅局限于WebWebAssembly从一开始就被设计为具有正式的语义。论文描述WebAssembly的动机,设计和形式语义,并提供一些实现的初步经验。论文的信息量很大,为了避免篇幅过长,本文仅简单介绍一下WebAssembly的基本概念和直观的性能提升效果。

一、基本概念

文章在第一章首先介绍了WebAssembly的一些特性,即安全性、运行速度、可移植性,压缩性(WebAssembly二进制格式非常紧凑,对于通过网络传输的代码来说能够占用较小带宽,提升加载速度)。同时,文章也回顾了在浏览器中运行底层代码在过去的解决之道。例如Microsoft's ActiveXNative ClientEmscripten等等。论文比较详细地介绍了WebAssembly的抽象语法,如图1所示。


1 WebAssembly抽象语法

二、性能测试

论文首先以本机代码(Native Code,使用Clang生成)的运行时间为基准,使用PolyBenchCWebAssembly(使用Emscripten生成)进行了性能测试,测试结果如图2所示。在这张图里使用Native Code运行时间做归一化,所以100%的一条横线是Native Code的运行时间,Native Code是用Clang编译的真正的二进制程序,WebAssembly4中情况运行速度更快,7种情况最多没有超过Native Code 10%,而大部分情况是没有超过Native Code200%的,这个性能对于运行在V8SpiderMonkey浏览器引擎里的代码来说,已经非常快了。


图2 WebAssembly与Native Code运行时间对比

对于WebAssemblyasm.js的速度对比,论文没有进行画图比较,作者提到了WebAssembly相较于asm.js快了33.7%。另外,对于代码的紧凑性,实验也进行了比较。论文比较了WebAssemblyasm.js,以及WebAssemblyx86-64本机代码(Native Code)。图3用比值的形式直观地对比了二进制代码的紧凑性。


图3 WebAssembly与asm.js和NativeCode二进制大小对比

平均来说,WebAssembly代码是asm.js的大小的62.5%(中位数68.6%),以及本机x86-64代码大小的85.3%(中位数78%)。

三、总结

论文中提出的新技术已经在四大主流浏览器引擎中得到了实现。虽然WebAssembly201711月开始受到四大主流浏览器支持,到现在也仅仅过去半年,还有很多需要完善的地方。但是WebAssemblyWeb的一个新趋势,其更加广泛的应用势必会给Web带来新的能力和发展空间,同时可能也会为Web安全带来一个全新的领域。


以上是关于使用WebAssembly来加速Web的主要内容,如果未能解决你的问题,请参考以下文章

如何使用WebAssembly将Web应用的速度提高20倍(案例研究)

使WebAssembly更快:Firefox最新的流式分层编译器

使WebAssembly更快:Firefox最新的流式分层编译器

Chrome 91 支持 WebAssembly SIMD,加速 Web 在 AI 等领域的应用

WebAssembly 入门

使用Mono将C#编译运行至WebAssembly平台