WebAssembly--执行与内存模型

news2024/9/21 20:54:55

前言

在WebAssembly初探中,我们已经了解了WebAssembly的发展和标准演进过程,并简单地体验了一把Wasm的应用,本篇文章会通过对比WASM和JS的执行流程,WebAssembly的内存模型深入分析,带大家理解下WebAssembly部分核心原理,探究下其快的秘密。

下图是一组基准测试,可以看出WASM至少比JS运行时性能提升近1倍以上,那为什么WASM快呢,请往下看:

WebAssembly与Javascript

JavaScript 既是解释语言又是编译语言,所以 JavaScript 引擎在解析后启动执行。javascript引擎首先会先将资源下载下来,Javascript 引擎会等待整个资源全部下载完成。一旦资源下载完成,javascript 引擎会对资源进行解析(parse),parse 会将源代码转换成 javascript 解析器能运行的字节码。

JavaScript 引擎的监视器 (在某些浏览器中称为分析器)会跟踪代码执行情况,如果一个特定的代码块被频繁地执行,那么监视器将其标记为热代码。引擎使用即时 (JIT) 编译器编译代码块(比如v8 引擎的 baseline compiler)。整个编译过程发生在主线程,会占用主线程的资源,但被JIT优化后的代码会执行的效率更高,综合的ROI是可接受的,被编译的代码就是优化过程了。

JavaScript 引擎增加了一(或两)层优化,当一个函数调用频率更高时,编译器会标记这个函数并尝试更深度的来优化它。经过这次重新优化 (reoptimisation),编译器会进行更多的推断和生成优化代码。这个优化会花费更多的时间,但是它生成的代码会更快。JavaScript 是一种动态类型的语言,引擎所能做的所有优化都是基于类型的推断。如果推断失败,那么将重新解释并执行代码,并删除优化过的代码,而不是抛出运行时异常,如果重新推断发现类型变化了,那之前的优化就是纯浪费了。

最后一步是垃圾回收,将删除内存中的所有活动对象,JavaScript 引擎中的垃圾回收采用标记清除算法,在垃圾回收过程中,JavaScript 引擎从根对象 (类似于 Node.js 中的全局对象) 开始查找从根对象引用的所有对象,并将它们标记为可访问对象,它将剩余的对象标记为不可访问的对象,最后清除不可访问的对象。

WASM 是二进制格式文件,并且已经被提前编译和优化过成最终的.wasm。在运行过程, JS 引擎会先去加载 WASM 代码,然后解码并转换成模块的内部表达(即 AST)。这个阶段是解码阶段,解码阶段要远远比 JS 的编译阶段要快。

接下来,解码后的 WASM 进入编译阶段,在这个阶段,对模块进行验证,在验证过程中对函数、指令序列和堆栈的使用进行类型检查,然后将验证过的代码编译为机器码。由于 WASM 二进制代码已经提前编译和优化过了,所以在其编译阶段会更快。为了追求提升 WebAssembly 执行的速度,浏览器厂商实现了流式编译机制。流式编译允许 Javascript 引擎一边在 WebAssembly 模块还在下载时,一边进行编译和优化操作。相比于 Javascript 引擎需要等待 Javascript 文件全部下载完成,流式编译提升了这整个过程。

最后编译过的代码进入执行阶段,执行阶段,模块会被实例化并执行。在实例化的时候,JS 引擎会实例化状态和执行栈,最后再执行模块。

WASM 快的原因是因为它的执行步骤要比 JS 的执行步骤少,其二进制代码已经经过了优化和编译,并且可以进行流式编译。但总的来说,WASM 的执行效率并不是一直优于原生JS 代码执行,因为 WASM 代码和 JS 引擎交互和实例化也是要耗费时间的,一些和JS的胶水代码会抵消WASM本身的性能提升,所以需要考虑好使用场景。

WebAssembly内存模型

WebAssembly 模块的内存部分(memory section)是线性内存。

线性内存模型(linear memory model)是一个内存寻址技术,其中内存组织在单个地址空间中(organized in a single contagious address space),也被称为平面内存模型(Flat memory model)

线性内存模型使理解、编程和表示内存变得更容易。但是它也有巨大的缺点,例如重新排列内存中的元素需要大量的执行时间,并且会浪费大量的内存区域。

LLVM 编译 WebAssembly 的时候,会按照固定的内存布局。首先一开始是个数据(Data)区,主要是存放源码的全局数据和静态数据。Wasm 代码里面访问这些变量的时候,是通过使用静态的偏移量调用 iload、istore 来实现的。中间的 Aux Stack 是 Wasm 程序运行中做辅助栈使用的,它与数据区的边界是有一个 Wasm Global 来指向的,叫 data_end,data_end 是个 Global变量。Wasm 程序调用 malloc 时从其自己的 Heap 里面分配数据,heap 区的起始位置是在 heap_base 的 Global 来指定的,它的初始值是编译器在编译时确定的。

线性内存之外的内存区域被称作受管内存 (Managed Memory),这些对象的内存地址有些会逃逸用户的控制。第一种是 Globals,可以把它看成一个一维的数组,这里 data_end 是索引值为 1 的 Global,heap_base 是第二个 Global,还会有其他的一些变量按顺序依次排下去。

还有一种受管内存叫Locals。Locals在执行指令的时候,默认以当前的栈作为基础来进行访问和定位的。程序中基本类型的函数局部变量,可以使用 Locals 来映射,其他类型局部变量则会使用线性内存中 Aux Stack 来管理。和线性内存操作相比,Global 和 Local 操作目标的索引值是固定在 Wasm 文件中,说明其在编译期已然确定。而线性内存的地址是运行时才确定的。

最后还有一种叫做操作栈 (Operation Stack),Wasm字节码指令里会隐含操作栈访问,但没有任指令可以显式控制操作栈。此空间用来存储操作数和返回结果等数据。

最后

本文带大家认识了WebAssembly的执行过程和内存模型,希望大家能关注到WebAssembly快的原因,当然WebAssembly性能优势远不止这些,还有多线程和SIMD等技术支持,更进一步地希望大家明白WebAssembly不是银弹,高性能WebAssembly的程序需要高质量的代码,也可结合内存知识来实现。

欢迎关注公众号:江湖修行,第一时间和作者交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOC/DI注解开发管理第三方bean

文章目录 1 环境准备2 注解开发管理第三方bean步骤1:导入对应的jar包步骤2:在配置类中添加一个方法步骤3:在方法上添加Bean注解步骤4:从IOC容器中获取对象并打印 3 引入外部配置类3.1 使用包扫描引入步骤1:在Spring的配置类上添加包扫描步骤2:在JdbcConfig上添加配置注解步骤3:…

谷歌浏览器F请求解析说明

请求 Queued at 0s:表示该请求加入到请求队列中的时刻,请求队列在打开F12后第一次发送请求的时候创建,直到关闭控制台的时候销毁。 Started at 7.14s:表示请求开始处理的时刻。 Queueing:表示请求从加入到请求队列…

LeetCode 107. 二叉树的层序遍历 II

107. 二叉树的层序遍历 II 描述 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 示例1 输入:root [3,9,20,null,null,15,7] 输出…

Alibaba(一)项目环境合理选择

在学习以及开始使微服务架构前,我们需要先选择各各模块适配的版本。以此来避免生产过程或者学习过程出现令人头疼的版本问题,避免花费大量时间去找更正这些版本错误,导致耽误学习,影响项目进度。 项目源码,及源文档地址…

XPATH 使用备忘

xpath的基础使用 一.xpath简介 XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。 XPath 使用路径表达式在 XML 文档中进行导航XPath 包含一个标准函数库XPath 是 XSLT 中的主要元素XPath 是一个 W3C 标准 节点 在 XPath 中&…

【Linux】有名管道介绍及使用

目录 有名管道有名管道使用 橙色 有名管道 有名管道(FIFO)和匿名管道(pipe)有一些特点是相同的,不一样的地方在于: FIFO在文件系统中作为一个特殊文件存在,但文件中是没有内容的, FIFO中的内容存放在内存中。当使用FIFO的进程退出后, FIFO文…

在离散混合制造环境中应用制造运营模型

介绍 本文所描述的所有制造过程、场景、操作模式和技术应用目前都在一个成熟的离散和离散/批量混合制造企业中使用,该企业生产和维修复杂的机器。该企业生产的产品范围从从棒材加工的简单零件到复杂的机械装配;最终产品包括许多内部和第三方提供的子装配…

5.2————运算符重载

对于基本的数据类型,C提供来许多预先定义的运算符,如“,-,*,/”等,他们的运用大家应该已经很熟悉了。那么我们引入运算符重载的概念到底是为什么,比如是我们的加号可以完成基本数据类型的相加&a…

mysql 修改最大连接数max_connections

mysql 修改最大连接数max_connections 1、编辑mysql service文件2、编辑mysql 配置文件3、重启MySQL服务4、查看max_connections 1、编辑mysql service文件 查找mysql service文件 find / -name mysql*.service先备份再编辑 cp /usr/lib/systemd/system/mysqld.service /usr…

【C++ STL】 那年我双手插兜,学会了stackqueuepriority_queue基础知识及其模拟实现【对话情景版】

文章目录 📍前言C STL 之 stack&queue基础知识及其模拟实现📍容器适配器🎈什么是适配器?🎈STL标准库中stack和queue的底层结构🎈deque的简单介绍(了解)📌deque的原理介绍📌deque…

基于SSM的书画拍卖网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

软件系统外包开发流程及注意事项

当企业发展到一定规模后,市场上通用的软件系统往往就无法满足自身的业务需要,这时就需要企业开发属于自己软件系统。软件系统是一项比较复杂的系统工程,从需求分析、代码开发到最后的上线需要比较长的时间,需要有系统的管理方法才…

问题记录:Datax+Datax-web2.1.2的一系列问题

问题1:DataX报错解决办法 - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数 问题原因: 正如中文字面上所说,DataX的配置有问题,单个channel的bps值不能为空,也不能为非正数。…

教你怎么翻译英语语音

在当今全球化的时代,跨语言交流是一种常态。无论你是在国外旅游时无法理解当地人说的英文意思,还是因为职业需要与国外客户、供应商进行交流,这时候通过翻译英文语音就可以帮助你获取对话内容,缩短沟通时间和提升工作效率。那对于…

【windows批处理batch】.bat文件循环判断语句

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

计算机毕业论文内容参考|基于java的学生成绩分析系统的设计与实现

文章目录 导文摘要前言课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计系统架构设计数据库设计安全认证设计数据可视化设计技术实现后端实现安全认证实现数据可视化实现总结与展望本文总结后续工作展望导文 基于java的学生成绩分析

【逆向工程核心原理:TLS回调函数】

TLS 代码逆向分析领域中,TLS(Thread Local Storage,线程局部存储)回调函数(Callback Function)常用反调试。TLS回调函数的调用运行要先于EP代码的执行,该特征使它可以作为一种反调试技术的使用…

【经验总结】你想知道的BGA焊接问题都在这里

BGA是一种芯片封装的类型,英文 (Ball Grid Array)的简称,封装引脚为球状栅格阵列在封装底部,引脚都成球状并排列成一个类似于格子的图案,由此命名为BGA。 主板控制芯片诸多采用此类封装技术,采用BGA技术封装的内存&am…

聚焦 TimescaleDB VS TDengine 性能对比报告,五大场景全面分析写入与查询

基于第三方基准性能测试平台 TSBS(Time Series Benchmark Suite) 标准数据集,TDengine 团队分别就 TSBS 指定的 DevOps 中 cpu-only 五个场景,对时序数据库(Time Series Database,TSDB)Timescal…

ACT:非对称协同训练的半监督域自适应医学图像分割

文章目录 ACT: Semi-supervised Domain-Adaptive Medical Image Segmentation with Asymmetric Co-training摘要本文方法实验结果 ACT: Semi-supervised Domain-Adaptive Medical Image Segmentation with Asymmetric Co-training 摘要 作者建议以统一的方式利用标记的源域和…