WebAssembly 为什么比 asm.js 快?

作者:Alon Zakai

编译:胡子大哈

翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a07e449fdd28

英文原文:Why WebAssembly is Faster Than asm.js

** 转载请注明出处,保留原文链接以及作者信息**


本文作者:Alon Zakai

英文连接:Why WebAssembly is Faster Than asm.js

WebAssembly 是为 Web 而设计的、可以生成浏览器可执行的二进制文件的编程语言。并且于2017 年 2 月 28 日,四个主要的浏览器一致同意宣布 WebAssembly 的 MVP 版本已经完成,即将推出一个浏览器可以搭载的稳定版本。WebAssembly 的一个主要目标就是变。本文将给出一些它如何变快的技术细节。

当然,“快”是相对的概念。相比于 JavaScript 和其他动态语言,WebAssembly 的快主要是因为它的静态类型特性和方便优化特性。WebAssembly 意在速度上能够达到和本地执行一样快,其实 asm.js 已经比较接近这一目标了,但是 WebAssembly 要进一步缩短和本地执行速度之间的差距。因此本文着重介绍为什么 WebAssembly 比 asm.js 更快。

在开始介绍之前,先做一些说明:新的技术总是有一些还没来得及优化的情况,所以目前来说,并不是所有情况下 WebAssembly 都是最快的。本文主要表达的是 WebAssembly 为什么应该是更快的。对于它还不是那么快的一些情况,也是未来需要 fix 的问题。

那么有了这些标准以后,我们来介绍为什么 WebAssembly 更快。

1. 启动

WebAssembly 设计之初就定位在:体积更小、下载更快、解析更快,这样即使应用于一个大型的 web 应用上启动也会很快。

JavaScript 代码通过 gzip 进行压缩,与本地代码相比它已经压缩了很多,想要进一步缩小它的体积确实不是一件容易的事情。但是通过对 WebAssembly 文件大小的精心设计(LEB128 指标),二进制格式的 WebAssembly 的文件大小要比压缩后的 JavaScript 文件更小。通常来讲,要比 gzip 压缩后的小 10% - 20%

WebAssembly 在解析过程有更大的进步:它的解析速度要比 JavaScript 快一个数量级。这得益于 WebAssembly 的二进制格式就是为更适合解析而设计的。同时 WebAssembly 的解析和优化函数也更容易实现并行,这一特点在多核机器上的体现更好。

影响启动时间的因素除了下载和解析以外还有很多,比如代码的 VM 完全优化、执行之前下载所必须的额外文件等。但是下载和解析步骤是无论如何都不可避免的步骤,因此要尽可能地对它们进行优化。不论是对于浏览器还是 app,其他的影响因素都有办法避免或者缓和它们的影响(例如代码的完全优化,可以通过 WebAssembly 的基线编译器或解释器来避免)。

2. CPU 特性

使得 asm.js 这么快的技巧之一是利用好 CPU 特性。JavaScript 数字类型都是 double 型的,在 asm.js 中加法操作后会有一个按位与的操作,这使得 double 加法这个操作,在逻辑上和 CPU 做简单的 int 加法(CPU 做简单 int 加操作很快)是等价的。而 asm.js 巧妙地通过这种方式使得 VM 可以更加有效地利用 CPU。

但是有一些 JavaScript 中表达的东西,asm.js 是表达不了的。
WebAssembly 则不受 JavaScript 的约束,我们一起来看一下更多的可利用的 CPU 特性:

  • 64 位整型。基于 64 位整型的操作速度可以快 4 倍。例如可以增加哈希算法和加密算法的速度。
  • 加载和存储偏移量。它的用处特别广泛,基本上所有包含域的内存对象都涉及到偏移量的问题(如 C 语言中 struct 等)。
  • 非对齐加载和存储。这避免了 asm.js 所需要的 mask(asm.js 为 Typed Array 兼容而做的操作),同时这在几乎所有的加载和存储问题都用得上。
  • 多种 CPU 指令,例如 popcount,copysign 等。每一个指令都有助于某种具体使用场景(例如,popcount 在密码分析这个场景下很有用)。

在每一种具体场景下到底能起到多大作用,要依赖于如何使用上面提到的特性。和正常使用 asm.js 相比,我们的统计是大概比 asm.js 提升了 5% 的速率。未来还有更多可挖掘的 CPU 特性来提高速率,例如 SIMD

3. 工具链改进

WebAssembly 是编译器生成的主要目标,所以它的运行主要包含两个部分:生成它的编译器(工具链端)和运行它的虚拟机(浏览器端)。优良的性能全都依赖于这两部分。

对于 asm.js,情况也类似,并且 Emscripten 做了一系列对工具链的优化,还做了运行 LLVM 的优化器和 Emscripten 的 asm.js 优化器。对 WebAssembly 的优化都是在这些的基础上来设计的,并且同时还加入了一些专门针对 WebAssembly 的改进。我们自己在学习 asm.js 的过程对我们改善 WebAssembly 很有帮助,尤其体现在一下几个方面:

总的来说,这些工具链的改进,在 asm.js 的基础上进一步提升了 WebAssembly 的速度(Box2D 速度评测中,WebAssembly 的速度分别提升了 5% 和 7%)。

可预见的优良性能

asm.js 的速度很接近本地执行的速度了,但是它不可能在所有的浏览器中都达到同样的标准。因为在使用 asm.js 的过程中,一些人尝试用一种方法来优化 asm.js,而另一些人用另一种方法优化,这导致了不同人有不同的版本和结果。虽然随着时间的推移,大家对于 asm.js 也达成了某种共识,但是对于 asm.js 来讲,本质问题是它还是没有一个统一的标准。它只是一个由一个厂商推出的,非标准的 JavaScript 子集而已,而它的使用者根据自己的偏好和习惯来使用它。

WebAssembly 则不同,它是由几大主要的浏览器厂商共同设计的。与 JavaScript相比,JavaScript 只能通过一些创新方法或者 asm.js 这种方法来提高速度,而不论哪种方法都不可能适用于所有浏览器。WebAssembly 的优化方案则得到了大多数厂商的认可。对于 WebAssembly 来讲,对于不同的 VM 依旧有很大的提升空间(如 AOT、JIT 有不同编译方式)。不过能够基本断定的是,可以应用于整个网络的优良性能是指日可期的。

想了解更多关于 WebAssembly 的知识,请移步下面 WebAssembly 系列文章。

背景知识:

当前 WebAssembly 的状况

WebAssembly 的未来

转载请注明出处,保留原文链接以及作者信息

欢迎大家关注我的前端大哈 - 知乎专栏,定期发布高质量前端文章。


我最近正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,欢迎指点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容