图说WebAssembly(五):高性能原因

我们希望开发者可以把部分JavaScript代码替换为WebAssembly。

例如,React团队可以把虚拟DOM改用WebAssembly来实现。这样的话,使用React的开发者也不需要做任何适配,但是它们却能获得更高性能。

能够促使React团队这么做的原因最可能是WebAssembly的高性能。但是到底是什么使它有高性能呢?

在我们理解JavaScript和WebAssembly之间的性能差异原因之前,我们需要先理解JavaScript引擎所做的工作。

下图给了一个粗糙的描述,概括了当前JS应用的启动性能。

要注意的是,这些过程并不会以离散块或者特定的顺序发生。相反,它们是交叉进行的。可能会解析完一小段,就会运行一段,然后编译一段;接着解析更多代码,然后执行更多代码等等。

这种分段交叉进行的设计相比早期的JavaScript来说是一种很大的性能提升,早期的JavaScript执行更像是下图中的情形。

在最开始的时候,只有解析器来跑JavaScript,执行速度是相当慢的。当引入JIT后,执行速度得到了大幅提升。

因此,性能还是有提升空间的。

下图是与典型网页应用相比时,WebAssembly的大致过程。

不同浏览器的处理可能略有不同,下面我们以SpiderMonkey引擎为例来说明各个过程。

因为WebAssembly代码比JavaScript代码更加的精简,所以加载WebAssembly文件是更快的。尽管压缩算法能够极大减小JavaScript代码的体积,但是WebAssembly压缩后的二进制代码仍然比它要小。

JavaScript代码一旦下载到浏览器,它会被解析为抽象语法树(AST)。

浏览器通常采用的策略是惰性处理,即只解析真正被用到的代码以及只为还没被调用的函数创建存根。

而WebAssembly则不需要这种转换,因为它本身已经是一种中间代码了。它只需要经过解码,并且验证解码没有发生错误即可。

不同的浏览器编译WebAssembly时使用不同方式。一些浏览器会在运行代码前先进行基准编译,其他浏览器则会使用JIT。

但不管是哪种方式,WebAssembly都是从里机器码比较近的地方开始的。比如说,程序本身就包含了数据的类型信息,这样的话就会有更高的性能,因为:

编译器并不需要基于不同类型来编译出相同代码的不同类型版本代码

有很多优化已经在LLVM之前完成了,所以这里可以减少编译和优化的开销

有时候JIT必须丢弃之前已经优化的代码并且重新编译。

这种情况就发生在JIT之前的假设都不成立时。比如说,当循环中使用了与之前不一样的变量类型,或者原型链上新增了一个函数。

而在WebAssembly中,数据类型是很明确的,所以JIT不需要对运行时的数据类型做任何假设。也就意味着,它不不存在重新优化可能。

编写出高性能的JavaScript代码是可能的。为此,你需要知道JIT是如何做优化的。比如,你需要知道如何写出让编译器特定化数据类型的代码。

但是,大多数开发者并不知道JIT的内部实现。即便是了解JIT内部实现的人,也很难直接击中要害。许多我们为了让代码更具可读性的编程模式(比如抽出公共函数来处理多种类型)反而阻碍了编译器的优化。

而且,不同浏览器的JIT所采用的各种优化手段是不同的,这就导致了可能在某款浏览器上是最优的,但是在另一款浏览器中则是很差的。

正因为这个,运行WebAssembly通常是更加快速的。许多JIT做的优化在WebAssembly中根本不存在。

此外,WebAssembly是被设计为一个编译目标的。也就是说,它是被用来作为编译器输出的,而不是用来供开发者编码的。

因为开发者不需要直接对WebAssembly编码,所以它能够使用更适合机器的指令,而这些指令通常能做到10%~800%的性能提升。

在JavaScript中,开发者并不需要专门去清理那些不再使用的变量所占用的内存。这种清理工作由JavaScript引擎自动进行,称为垃圾回收(GarbageCollection)。

但是,如果你想要得到可预期的性能,这可能会成为阻碍。你并不能控制什么时候进行垃圾回收,所以它随时可能发生。尽管大多数浏览器在垃圾回收的调度方面做的相当不错,但是它仍然可能阻碍你的代码运行。

至少现在,WebAssembly根本不支持垃圾回收。所有内存都是手动管理的。虽然这样会让编码变得更加困难,但是它也让性能变得更加稳定。

所以,WebAssembly之所以比JavaScript拥有更好的性能,是因为以下原因:

解码WebAssembly比解析JavaScript更快

不会发生重新优化的过程,因为WebAssembly自带数据类型和其他信息

不存在垃圾回收的过程,因为它是手动管理内存的

以上就是为什么在大多数时候,WebAssembly都比JavaScript性能好的原因。

当然,WebAssembly也存在表现并不如期望的那样好的时候。同时,也有一些正在进行的改变使得它变得更快。这些我们会在下一篇中讨论。

THE END
1.区块链技术对废弃资源回收的应用.pptx区块链技术对废弃资源回收的应用汇报人:PPT可修改20240122引言废弃资源回收现状分析区块链技术在废弃资源回收中的应用基于区块链技术的废弃资源回收系统设计系统实现与测试分析总结与展望contents目录01引言废弃资源回收现状01目前,https://m.renrendoc.com/paper/315126093.html
2.区块链与环保:如何促进可持续发展区块链技术是一种去中心化的分布式数据存储和交易系统,它的核心概念是将数据存储在一个由多个节点组成的链表中,每个节点称为区块,每个区块包含一定数量的交易数据,并且与前一个区块通过一个哈希值链接在一起。这种结构使得区块链具有高度的安全性和不可篡改性,因此它被认为是一种有潜力的技术,可以应用于许多领域,包https://blog.csdn.net/universsky2015/article/details/137313394
3.进击的垃圾分类“区块链+”突起狂风2019年,长沙县将试点“区块链+垃圾分类”模式,在城区5个街道分别建设1个“蓝岛”,配备相应数量的“蓝鲸”,打通可回收物、有害垃圾的收运体系,在整个城区形成“三网融合”蓝色完整体系,全面铺开‘小蓝屋’布点。 青岛 在青岛举办的区块链与人工智能跨界融合峰会上,就提出了基于区块链技术在互联网+垃圾分类智能回收https://www.solidwaste.com.cn/news/298330.html
4.百度测开一面凉经+技术中台质量部一二三四面(已OC)4.对比下你说的垃圾回收算法有什么优缺点适合怎样的业务 5.线程池,了解什么呢,优点跟缺点是什么 6.进程跟线程区别 7.IO密集型和CPU密集型应该怎么选取多线程跟多进程 8.线程的五种状态,是怎么相互转换的 9.https加密过程 10.Fiddler,postman 抓包过程,注意什么,然后代理的是哪一部分 https://ceshiren.com/t/topic/18913
5.海南将以“互联网+回收”模式推动塑料垃圾治理海南省商务厅市场建设处二级调研员陈大富介绍,当前塑料垃圾处理存在精细化分拣水平低、再生利用率低、商品交易信息不对称等问题,而以物联网、大数据、区块链等技术为基础的“互联网+回收”模式将有效解决货源散、回收难等瓶颈问题,同时可以实现回收全流程信息追溯,做到及时、公开、共享。 https://m.gmw.cn/2022-05/07/content_1302934135.htm
6.JDK8默认垃圾回收器腾讯云开发者社区JDK8默认垃圾回收器 ? Contents java-XX:+PrintCommandLineFlags-version-XXInitialHeapSize536870912-XXMaxHeapSize=8589934592XXPrintCommandLineFlags-XXUseCompressedClassPointersXX:+UseCompressedOops-XX:+UseParallelGC java version"1.8.0_261"Java(TM)SERuntimeEnvironment(build1.8.0_261-b12)JavaHotSpot(TM)64https://cloud.tencent.com/developer/article/1791804
7.代代科技垃圾分类行业专家代代环境科技,垃圾分类智慧监管解决方案服务商,专注于垃圾分类全过程监管;旗下产品哗哗回收采用“互联网+”“以车代库”模式,主要面向于从事可回收物回收的企业或个人,基于公有云模式,结合物联网IOT、大数据技术, 实现居民参与度高、企业可盈利、政府有效监管,可复制的https://www.daidai.cn/
8.WebAssembly现在,WebAssembly 根本不支持垃圾回收。内存是手动管理的(就像 C/C++)。虽然这些可能让开发者编程更困难,但它的确提升了性能。 综上所述,WebAssembly代码在优化和执行上都有更高的效率。同时也节省了Parsing,重新优化和GC。所以性能上有了质的提升。 那么开发一个WebAssembly容易么?下面我们通过一个Demo体验一下。 https://www.jianshu.com/p/f7d98c422e0c
9.科学网—电子垃圾处理的经验借鉴4) 健全电子垃圾回收环节,引导电子垃圾处理产业化和无害化。由于电子垃圾产业化投资较大,其原材料(电子垃圾)若供应不上,生产就要受到影响,政府必须采取一些相应的免息、免税、贷款优惠等措施,促进电子垃圾处理产业完善回收系统和处理系统,以使电子垃圾的产业化处理能正常运行。 https://www.360doc.cn/article/64440488_839320102.html
10.小水母资源回收废品系统开发经营范围游戏软件设计制作;集成电路设计;数据处理和存储服务;信息技术咨询服务;计算机房维护服务;信息系统集成服务;软件开发;互联网区块链技术研究开发服务;软件批发;软件零售;软件服务;人工智能算法软件的技术开发与技术服务;软件测试服务;软件技术推广服务;互联网商品销售(许可审批类商品除外);互联网商品零售(许可审批类商http://guangzhou.11467.com/info/14548654.htm
11.淄博市博山区润泽固废处置厂铸造废砂及建筑垃圾回收利用项目.pdf淄博市博山区润泽固废处置厂铸造废砂及建筑垃圾回收 利用项目.pdf,建设项目环境影响报告表 项目名称:淄博市博山区润泽固废处置厂铸造废砂及建筑垃圾回收 利用项目 建设单位 (盖章):淄博市博山区润泽固废处置厂 编制日期:2018 年 12 月 中华人民共和国生态环境部制 《建https://max.book118.com/html/2021/0806/8127073113003130.shtm
12.《天津市“十四五”城市基础设施建设实施方案》发布!(二)完善生活垃圾资源回收利用体系 加强可回收物回收、分拣、处置设施建设,合理布局、统筹推进生活垃圾分类回收与再生资源回收“两网融合”。建设与生活垃圾可回收物收运体系相衔接的再生资源回收网点,提高可回收物再生利用和资源化水平。开展回收利用行业转型升级,规范建设回收网络体系,推动废玻璃等低值可回收物的回收和https://www.sayyas.com/index.php?g=Content&m=Pagedis&a=shows_art&catid=41&id=775