摘要:目前正在开发两个编译器系统。这就意味着有很多功能还在襁褓之中,没有经过彻底思考以及实际验证。这些特性叫做未来特性。实现这一功能将会使用中的,而这一功能的实现将会提高程序执行的效率。目前浏览器在逐渐支持用标记来加载模块。
作者:Lin Clark
编译:胡子大哈
翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce7fd3a6d8a07e449fdd26
英文原文:Where is WebAssembly now and what’s next?
转载请注明出处,保留原文链接以及作者信息
本文是关于 WebAssembly 系列的第六篇文章(本系列共六篇文章),也同时是本系列的收尾文章。如果你没有读先前文章的话,建议先读这里。如果对 WebAssembly 没概念,建议先读这里(中文文章)。
2017 年 2 月 28 日,四个主要的浏览器一致同意宣布 WebAssembly 的MVP 版本已经完成,它是一个浏览器可以搭载的稳定版本。
它提供了浏览器可以搭载的稳定核,这个核并没有包含 WebAssembly 组织所计划的所有特征,而是提供了可以使 WebAssembly 稳定运行的基本版本。
这样一来开发者就可以使用 WebAssembly 代码了。对于旧版本的浏览器,开发者可以通过 asm.js 来向下兼容代码,asm.js 是 JavaScript 的一个子集,所有 JS 引擎都可以使用它。另外,通过 Emscripten 工具,你可以把你的应用编译成 WebAssembly 或者 asm.js。
尽管是第一个版本,WebAssembly 已经能发挥出它的优势了,未来通过不断地改善和融入新特征,WebAssembly 会变的更快。
提升浏览器中 WebAssembly 的性能随着各种浏览器都使自己的引擎支持 WebAssembly,速度提升就变成自然而然的了,目前各大浏览器厂商都在积极推动这件事情。
JavaScript 和 WebAssembly 之间调用的中间函数目前,在 JS 中调用 WebAssembly 的速度比本应达到的速度要慢。这是因为中间需要做一次“蹦床运动”。JIT 没有办法直接处理 WebAssembly,所以 JIT 要先把 WebAssembly 函数发送到懂它的地方。这一过程是引擎中比较慢的地方。
按理来讲,如果 JIT 知道如何直接处理 WebAssembly 函数,那么速度会有百倍的提升。
如果你传递的是单一任务给 WebAssembly 模块,那么不用担心这个开销,因为只有一次转换,也会比较快。但是如果是频繁地从 WebAssembly 和 JavaScript 之间切换,那么这个开销就必须要考虑了。
快速加载JIT 必须要在快速加载和快速执行之间做权衡。如果在编译和优化阶段花了大量的时间,那么执行的必然会很快,但是启动会比较慢。目前有大量的工作正在研究,如何使预编译时间和程序真正执行时间两者平衡。
WebAssembly 不需要对变量类型做优化假设,所以引擎也不关心在运行时的变量类型。这就给效率的提升提供了更多的可能性,比如可以使编译和执行这两个过程并行。
加之最新增加的 JavaScript API 允许 WebAssembly 的流编译,这就使得在字节流还在下载的时候就启动编译。
FireFox 目前正在开发两个编译器系统。一个编译器先启动,对代码进行部分优化。在代码已经开始运行时,第二个编译器会在后台对代码进行全优化,当全优化过程完毕,就会将代码替换成全优化版本继续执行。
添加后续特性到 WebAssembly 标准的过程WebAssembly 的发展是采用小步迭代的方式,边测试边开发,而不是预先设计好一切。
这就意味着有很多功能还在襁褓之中,没有经过彻底思考以及实际验证。它们想要写进标准,还要通过所有的浏览器厂商的积极参与。
这些特性叫做:未来特性。这里列出几个。
直接操作 DOM目前 WebAssembly 没有任何方法可以与 DOM 直接交互。就是说你还不能通过比如 element.innerHTML 的方法来更新节点。
想要操作 DOM,必须要通过 JS。那么你就要在 WebAssembly 中调用 JavaScript 函数(WebAssembly 模块中,既可以引入 WebAssembly 函数,也可以引入 JavaScript 函数)。
不管怎么样,都要通过 JS 来实现,这比直接访问 DOM 要慢得多,所以这是未来一定要解决的一个问题。
共享内存的并发性提升代码执行速度的一个方法是使代码并行运行,不过有时也会适得其反,因为不同的线程在同步的时候可能会花费更多的时间。
这时如果能够使不同的线程共享内存,那就能降低这种开销。实现这一功能 WebAssembly 将会使用 JavaScript 中的 SharedArrayBuffer,而这一功能的实现将会提高程序执行的效率。
SIMD(单指令,多数据)如果你之前了解过 WebAssembly 相关的内容,你可能会听说过 SIMD,全称是:Single Instruction, Multiple Data(单指令,多数据),这是并行化的另一种方法。
SIMD 在处理存放大量数据的数据结构有其独特的优势。比如存放了很多不同数据的 vector(容器),就可以用同一个指令同时对容器的不同部分做处理。这种方法会大幅提高复杂计算的效率,比如游戏或者 VR。
这对于普通 web 应用开发者不是很重要,但是对于多媒体、游戏开发者非常关键。
异常处理许多语言都仿照 C++ 式的异常处理,但是 WebAssembly 并没有包含异常处理。
如果你用 Emscripten 编译代码,就知道它会模拟异常处理,但是这一过程非常之慢,慢到你都想用 “DISABLE_EXCEPTION_CATCHING” 标记把异常处理关掉。
如果异常处理加入到了 WebAssembly,那就不用采用模拟的方式了。而异常处理对于开发者来讲又特别重要,所以这也是未来的一大功能点。
其他改进——使开发者开发起来更简单一些未来特性不是针对性能的,而是使开发者开发 WebAssembly 更方便。
一流的开发者工具。目前在浏览器中调试 WebAssembly 就像调试汇编一样,很少的开发者可以手动地把自己的源代码和汇编代码对应起来。我们在致力于开发出更加适合开发者调试源代码的工具。
垃圾回收。如果你能提前确定变量类型,那就可以把你的代码变成 WebAssembly,例如 TypeScript 代码就可以编译成 WebAssembly。但是现在的问题是 WebAssembly 没办法处理垃圾回收的问题,WebAssembly 中的内存操作都是手动的。所以 WebAssembly 会考虑提供方便的 GC 功能,以方便开发者使用。
ES6 模块集成。目前浏览器在逐渐支持用 script 标记来加载 JavaScript 模块。一旦这一功能被完美执行,那么像 这样的标记就可以运行了,这里的 url 可以换成 WebAssembly 模块。
总结WebAssembly 执行起来更快,随着浏览器逐步支持了 WebAssembly 的各种特性,WebAssembly 将会变得更快。
我最近正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,欢迎指点。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82041.html
摘要:但是为什么执行的更快呢在这个系列文章中,我会为你解释这一点。所以当人们说更快的时候,一般来讲是与相比而言的。被人们广为传播的性能大战在年打响。性能的提升使得的应用范围得到很大的扩展。现在通过,我们很有可能正处于第二个拐点。 作者:Lin Clark 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce8036...
摘要:并且于年月日,四个主要的浏览器一致同意宣布的版本已经完成,即将推出一个浏览器可以搭载的稳定版本。因此本文着重介绍为什么比更快。本文主要表达的是为什么应该是更快的。则不同,它是由几大主要的浏览器厂商共同设计的。 作者:Alon Zakai 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...
摘要:图表中的比例并不代表真实情况下的确切比例情况。解析当到达浏览器时,源代码就被解析成了抽象语法树。解析过后抽象语法树就变成了中间代码叫做字节码,提供给引擎编译。目前为止,不支持垃圾回收。这就是为什么在大多数情况下,同一个任务比表现更好的原因。 作者:Lin Clark 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId...
摘要:现状年月日,主流的四大浏览器达成了共识并宣布的最小可行产品已经完成。更快的函数调用当前,在中调用函数比想象的要慢。直接操作目前,没有任何方式能够操作。这就导致了部分应用可能会因此而推迟发布时间。结束现如今已经相当快速。 本文是图说 WebAssembly 系列文章的最后一篇。如果您还未阅读之前的文章,建议您从第一篇入手。 现状 2017 年 2 月 28 日,主流的四大浏览器达成了共识...
摘要:性能简史在年,被创造出来时并不是冲着性能去的。而且在之后的十年发展中,它的性能一直是很低的。的引入成就了性能提升的一个转折点,其执行速度比以往快了之多。性能提升也使得在全新的问题上使用成为可能。现在,极可能是下一个性能转折点。 你可能已经听说 WebAssembly 代码跑起来非常快。但是你知道这是为什么吗?在本系列文章中,我们将探究其原因。 何为 WebAssembly WebAss...
阅读 1319·2021-11-24 09:38
阅读 2040·2021-09-22 15:17
阅读 2245·2021-09-04 16:41
阅读 3342·2019-08-30 15:56
阅读 3484·2019-08-29 17:19
阅读 1913·2019-08-28 18:09
阅读 1218·2019-08-26 13:35
阅读 1680·2019-08-23 17:52