WebAssembly 为什么能提升性能,怎么使用它 ?
文章目录
- 简介:
- 起源:
- 前端性能提升历史
- JIT(Just-In-Time)编译器(即时编译)
- 为什么需要WebAssembly:
- WebAssembly能做什么:
- 经常说WASM的性能高,为什么高??
- 使用方法:
- Emscripten 使用:
- js 中加载 `.wasm`
- 参考链接:
简介:
- WebAssembly(简称Wasm)是一种新的编码方式,WebAssembly 是一种技术,该技术能让除 JavaScript 以外的代码运行在浏览器上。
- 它是一种低级的类汇编语言,具有紧凑的
二进制格式
,可以为C/C++、C#和Rust等语言
提供编译目标,使它们能够在Web上运行。
起源:
WebAssembly的前身是asm.js(文本格式)
,它是一个JavaScript的严格子集,通过强制静态类型来提高性能。但是asm.js仍然需要经过JavaScript引擎的解析和字节码编译步骤,这限制了它的性能。
因此,WebAssembly应运而生,它直接编译成Web浏览器可以理解的机器码
,跳过了这些步骤,从而提高了性能
。
前端性能提升历史
JIT(Just-In-Time)编译器(即时编译)
在程序运行时将中间代码动态编译成机器码的编译器,工作原理可以概括为以下几个步骤:
在JavaScript 引擎新增了一个组件,称为监视器(Monitor),将代码编译成更快的执行函数,并对执行过的代码标记(warm)
- 解析:JIT编译器首先解析程序的中间代码,构建出抽象语法树(AST)和符号表。
- 优化:对程序进行优化,如常量折叠、循环展开、内联函数等,以提高执行效率。
- 编译:将优化后的程序转换成机器代码,并生成代码缓存区,通常包含多个版本的代码以应对不同的运行情况。
- 执行:在程序运行时,JIT编译器动态地将缓存区中的代码加载到内存中,并选择合适的代码版本执行。
为什么需要WebAssembly:
JavaScript作为Web开发的主要语言,虽然功能强大,但在性能上存在局限,特别是在执行复杂计算和处理大量数据时。WebAssembly旨在解决这些问题
,提供一种新的代码执行方式,以接近原生应用的性能运行在Web平台上。
WebAssembly主要解决了前端性能瓶颈问题,它允许将性能密集型的应用程序带到Web上,比如3D游戏、图像和视频编辑、科学计算等。
WebAssembly能做什么:
- 提高性能: WebAssembly代码在浏览器中的执行速度接近原生应用。
跨平台运行
: 可以在不同的浏览器和设备上一致地运行。- 安全
沙箱环境
: 代码在安全的沙箱环境中执行,遵循同源策略和权限策略。 二进制格式
: WebAssembly 使用二进制格式,这意味着它在网络传输中更加紧凑- 与JavaScript协同工作: 可以与JavaScript代码一起使用,通过JavaScript调用WebAssembly模块中的功能。
经常说WASM的性能高,为什么高??
- WebAssembly是一种低级字节码,比JavaScript[解释性语言,需要转义]更接近计算机硬件
- WebAssembly代码比JavaScript代码
更加精简(二进制)
,因此加载WebAssembly文件通常更快,尤其是在网络速度较慢的情况下 - WebAssembly不需要像JavaScript那样解析为抽象语法树(AST),而是
直接解码
,这使得它在解析阶段比JavaScript更快 - WebAssembly在编译和优化时节省了时间,因为它比JavaScript更接近机器码,而且WebAssembly代码在编译前已经过优化
- JavaScript在运行时可能需要重新优化代码,这会导致性能损失。而WebAssembly的数据类型是明确的,因此不需要运行时优化
- 代码复用
使用方法:
Emscripten 使用:
Emscripten
是一个用于编译 C 和 C++ 代码到 WebAssembly 和 asm.js 的工具链。它允许开发者将桌面应用程序移植到 Web 平台.
安装 Emscripten:
-
克隆 Emscripten SDK 到本地机器。
git clone https://github.com/emscripten-core/emsdk.git
-
安装最新版本的 Emscripten。
cd emsdk && emsdk install latest
-
激活 Emscripten 环境。
emsdk activate latest
-
设置查看变量
emcc -c
- 创建
hello.c
代码
#include <stdio.h>int main()
{/* Write C code in this online editor and run it. */printf("Hello, WebAssembly! \n");return 0;
}
- 编译 C/C++ 代码:
使用 emcc
命令来编译代码。生成一个 WebAssembly 二进制文件和相应的 HTML 文件:
emcc hello.c -s WASM=1 -o hello.html # WASM=1 表示启用 WebAssembly 编译,如果不设置或设置为 0,则默认生成 asm.js 代码。
这将生成 hello.wasm
、hello.js
和 hello.html
文件。hello.js
是“胶水”代码,用于在浏览器中加载和运行 hello.wasm
。
- 运行示例:
在支持 WebAssembly 的浏览器中打开生成的
hello.html
文件,你将看到 “Hello, WebAssembly!” 的输出。
serve . # 打开 http://localhost:3000/hello.html
js 中加载 .wasm
fetch('module.wasm').then(response =>response.arrayBuffer()
).then(bytes =>WebAssembly.instantiate(bytes) // 编译并实例化 WebAssembly 模块。它接受 BufferSource 以及一个可选的导入对象,并返回一个包含模块和实例的 Promise。
).then(results => {// 这是 instance 对象的一个属性,它是一个包含了模块所有导出函数和变量的对象。// exported_func 是导出的一个实例函数results.instance.exports.exported_func();
});
参考链接:
- emscripten DOC
- WebAssembly API DOC
相关文章:
WebAssembly 为什么能提升性能,怎么使用它 ?
文章目录 简介:起源:前端性能提升历史JIT(Just-In-Time)编译器(即时编译) 为什么需要WebAssembly:WebAssembly能做什么:经常说WASM的性能高,为什么高??使用方法:Emscript…...
golang学习笔记13-函数(二):init函数,匿名函数,闭包,defer
注:本人已有C,C,Python基础,只写本人认为的重点。 这个知识点基本属于go的特性,比较重要,需要认真分析。 一、init函数 每个文件都可以定义init函数,它会在main函数执行前被调用,无论它的定义…...
HAproxy,nginx实现七层负载均衡
环境准备: 192.168.88.25 (client) 192.168.88.26 (HAproxy) 192.168.88.27 (web1) 192.168.88.28 (web2) 192.168.88.29 (php1) 192.168.88.30…...
ps aux | grep smart_webrtc这条指令代表什么意思
这条指令是在Linux系统中使用的命令,它的含义是列出所有正在运行的进程,并通过grep命令筛选出包含"smart_webrtc"关键字的进程。 具体解释如下: ps 是一个用于报告当前系统进程状态的命令。aux 是ps命令的选项,其中&a…...
第十三届蓝桥杯真题Python c组D.数位排序(持续更新)
博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 问题描述 小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。…...
【RabbitMQ】RabbitMq消息丢失、重复消费以及消费顺序性的解决方案
RabbitMq消息丢失主要是有三种情况:生产者消息未发送到服务端、服务端消息没有做持久化导致丢失、消费端未收到消息。解决方案依次如下: 开启事务或使用确认机制。对于一些重要的消息,生产者可以开启事务,确保消息发送成功后再提…...
海陆钻井自动化作业机器人比例阀放大器
海陆钻井自动化作业机器人是现代海洋石油勘探与钻井领域的关键装备,它通过自动化和无人化技术显著提高了钻井效率和安全性。海陆钻井自动化作业机器人主要用于在海上和陆地的钻井平台上进行自动化、无人化的一体化作业。这种设备能够自动切换钻杆,极大地…...
golang学习笔记19-面向对象(一):面向对象的引入
注:本人已有C,C,Python基础,只写本人认为的重点。 这节开始就是面向对象的内容了,为方便复用结构体等类型,本人定义了一个utils包,用于定义这些类型,之后的文章也会用到,希望读者注意…...
【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】
目录 stm32电路磁编码器电路电机驱动电路电流采样电路电机选择本文示例硬件说明 为了承载和验证本文的FOC代码工程,本节设计了一个简易的三相无刷电机 硬件套件,主控采用非常常用的stm32f103c8t6单片机,电机编码器采用MT6701,电机…...
unix中父进程如何获取子进程的终止状态
一、前言 本文将介绍在unix系统中,父进程如何获取子进程的终止状态。本文主要围绕如下函数展开: 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前,先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…...
【ESP 保姆级教程】小课设篇 —— 案例:20240505_基于esp01s的局域网控制灯
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝ὤ…...
Qt如何将外部窗口嵌入部件中
一、简述 今天给大家讲解的是使用QWindow类通过窗口句柄将外部的应用程序嵌入到我们的部件中来显示。在讲解之前可以延伸一下,当时项目中使用QProcess启动一些本地软件或者执行脚本时,需要将启动的第三方窗口嵌入到我们自己写的窗口中,此时我…...
2024年9月30日随笔
今天是国庆假期前的最后一天了,刚上完课,坐在实验室的工位前,感到焦虑又无奈,11月9号,网络规划工程师软考考试,学了一部分了,感觉有些难,还有一个月多一点点的时间,不知道…...
springboot+satoken实现刷新token(值变化)
欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 springbootsatoken实现刷新token satoken是什么?支持什么?为什么需要&…...
63.HDMI显示器驱动设计与验证-彩条实验
(1)常见的视频传输接口有三种: VGA 接口、 DVI 接口和 HDMI 接口,目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早,只能传输模拟图像信号; 随后…...
安卓13设置删除网络和互联网选项 android13隐藏设置删除网络和互联网选项
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有些客户不想让用户修改默认的网络配置,禁止用户进入里面调整网络相关的配置。 2.问题分析 像这个问题,我们有好几种方法去处理,这种需求一般…...
C++的6种构造函数
在 C 中,构造函数是一种特殊的成员函数,用于初始化类对象。在对象创建时自动调用,构造函数的主要作用是分配资源、初始化数据成员等。根据不同的功能和使用场景,C 提供了多种类型的构造函数: 1. 默认构造函数 (Defaul…...
【FE】NPM——概述
NPM基本使用 下载Node 老生常谈,选择LTS版本官网放这里:https://nodejs.cn/download/ 1.镜像配置:镜像源 镜像配置 依赖仓库:版本查看 //不确定仓库有哪些版本,列出指定包的所有版本 npm view <package-name&…...
Clipboard.js实现复制文本到剪贴板功能
一、Clipboard.js简介 Clipboard.js是一个轻量级的实现复制文本到剪贴板功能的JavaScript插件,该插件可以将输入框,文本域,DOM节点元素中的文本内容复制到剪贴板中。 官网地址:Clipboard.js 浏览器兼容性:兼容Chrome、…...
Harbor安装笔记
下载离线安装包 wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz 解压 tar -zxvf harbor-offline-installer-v2.11.1.tgz 复制一份配置文件出来,修改配置 cp harbor.yml.tmpl harbor.yml vim harbor…...
HTTP 1.0 2.0 3.0详解
HTTP HTTP全称超文本传输协议,是一种属于应用层的通信协议。它允许将超文本标记语言文档(HTML)从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法: GET:一般用来请求已被URI识别的资源&#x…...
Python操作TXT文本:从入门到精通
在数字化时代,文本处理成为了许多工作和项目的基础。Python作为一种强大且易学的编程语言,在文本处理方面展现出了无与伦比的优势。本文将通过举例的方式,向读者介绍如何使用Python来操作TXT文本,让您轻松掌握文本处理的精髓。 一、读取TXT文本内容 首先,我们需要学会如…...
开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的数据运营策略与价值创造
一、引言 1.1 研究背景 在当今数字化时代,数据运营已成为企业发展的核心驱动力。开源 AI 智能名片 21 链动模式 S2B2C 商城小程序作为一种创新的营销工具,与数据运营紧密相连。该小程序通过集成人工智能、大数据分析等先进技术,能够实时收集…...
ip 地址查看cmd命令
ip 地址查看cmd命令 在不同的操作系统中,查看IP地址的命令可能会有所不同。以下是一些常见操作系统中查看IP地址的命令: Windows: 打开命令提示符(CMD),然后输入 ipconfig 命令。 Linux/Unix: 打开终端࿰…...
力扣9.26
931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即…...
HT8731 内置自适应H类升压和防破音功能的10W D类及AB类音频功率放大器
1、特点 防削顶失真功能(防破音,Anti-Clipping Function, ACF) 免滤波器数字调制,直接驱动扬声器 输出功率 10W(VBAT4.2V,RL3Ω,THDN10%, fiN 1kHz) 6W(VBAT3.3~4.2V,RL4Ω,THDN<1%,20-20kHz 全频段) 3W (VBAT3.3~4.2V,RL8Ω, THDN<1%, 20- 20kHz 全频段 VB…...
webpack使用
一、简介 概述 本次使用webpack4进行构建打包 二、webpack 安装webpack、webpack-cli npm install webpack4.2.0 webpack-cli4.2.0 -D 三、loader 加载器概述 raw-loader:加载文件原始内容(utf-8) file-loader:把文件输出…...
高通Android 12 音量API设置相关代码
// 获取当前音量大小public static int getCurrentVolume(Context context) {AudioManager audioManager (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);return audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // 使用 STREAM_MUSIC 作为示例…...
Qt开发第一讲
一、Qt项目里面有什么? 对各个文件的解释: Empty.pro文件 QT core gui # 要引入的Qt模块,后面学习到一些内容的时候可能会修改这里 #这个文件相当于Linux里面的makefile文件。makefile其实是一个非常古老的技术了。 #qmake搭配.pr…...
详细指南:如何有效解决Windows系统中msvcp140.dll丢失的解决方法
如果你在使用Windows系统时遇到“msvcp140.dll丢失”的错误提示,通常是因为你的计算机上缺少或损坏了msvcp140.dll文件。msvcp140.dll是Microsoft Visual C Redistributable包的一部分,许多应用程序和游戏需要它来正常运行。以下是几种解决msvcp140.dll丢…...
个人网站推广手段有哪些/十大网络推广公司
1.背景 最近的项目需要同步另外一个数据库的数据,因此开始捣鼓springboot双(多)数据库的配置。参考了很多博客和手册,顺便整理了自己的项目,成功运行并。 2.思路 专门画个图,方便理解 3.按图走起&#x…...
工程公司工作总结/seo排名怎么优化软件
程序员不是写代码的么,为什么需要画图?很多程序员会认为写好代码就好,画好图有什么用?程序员成为架构师后是不是就天天画架构图,成为了所谓的 PPT 架构师?如上这些疑问,好几年前也曾让我困惑过。…...
做网站需要啥备案之类的嘛/网站品牌推广策略
prn是什么文件?使用打印机打印文件时,如果你在打印设置界面中选择“输出到文件”,那么随后输出到指定目录的文件默认是以.prn为扩展名,这个文件就是所谓的“prn文件”。prn文件虽然扩展名都是.prn,但对于不同品牌的打印机&#x…...
西安手机网站开发/免费b站推广网站2022
Ubuntu下VirtualBox本来可以很好地用的,今天早上一来就报错了,……提示如下内容: ------------------------------------------------------------------------- Kernel driver not installed (rc-1908) The VirtualBox Linux kernel drive…...
正版视频素材网站/茶叶网络推广方案
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).对 Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情ÿ…...
肥城网站制作/seo网站排名优化价格
一、MDN文字样式知识点 1、font-family: 提供一个字体栈? font-family: "Trebuchet MS", Verdana, sans-serif; 不止一个单词,用引号包裹 2、font-size单位:px、em、rem (1)px:绝对单位 (…...