使用WebAssembly优化Web应用性能

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用WebAssembly优化Web应用性能

    • 引言
    • WebAssembly 简介
      • 编译 WebAssembly 模块
        • 使用 Emscripten 编译 C/C++ 代码
        • 使用 Rust 编译 WebAssembly 模块
      • 加载和使用 WebAssembly 模块
      • 与 JavaScript 交互
        • 从 JavaScript 调用 WebAssembly 函数
        • 从 WebAssembly 调用 JavaScript 函数
      • 实际案例
        • 图像处理
      • 总结

引言

WebAssembly(简称 Wasm)是一种新的二进制格式,设计用于在 Web 上高效运行高性能应用程序。WebAssembly 可以在浏览器中以接近原生的速度运行,同时与 JavaScript 无缝集成。本文将详细介绍如何使用 WebAssembly 优化 Web 应用性能,包括基本概念、编译和加载 WebAssembly 模块、与 JavaScript 交互和实际案例等内容。

WebAssembly 简介

WebAssembly 是一种低级的类汇编语言,旨在为 C/C++、Rust 等语言提供一种编译目标,以便在 Web 上高效运行。WebAssembly 的主要特点包括: - **高性能**:WebAssembly 代码可以在浏览器中以接近原生的速度运行。 - **小体积**:WebAssembly 模块通常比同等功能的 JavaScript 代码体积更小。 - **安全性**:WebAssembly 运行在沙盒环境中,确保安全性和隔离性。 - **与 JavaScript 无缝集成**:WebAssembly 模块可以与 JavaScript 代码无缝交互。

编译 WebAssembly 模块

要使用 WebAssembly,首先需要将源代码编译成 WebAssembly 模块。常用的编译工具包括 Emscripten(针对 C/C++)和 Rust 的 `wasm32-unknown-unknown` 目标。
使用 Emscripten 编译 C/C++ 代码
安装 Emscripten:
# 安装 Emscripten SDK
sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm
sudo npm install -g emscripten

# 初始化 Emscripten 环境
emcc
编译 C/C++ 代码:
// add.c
int add(int a, int b) {
  return a + b;
}
# 编译成 WebAssembly 模块
emcc add.c -s WASM=1 -o add.js
使用 Rust 编译 WebAssembly 模块
安装 Rust 和 `wasm-pack`:
# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装 wasm-pack
cargo install wasm-pack
创建一个新的 Rust 项目并编译:
# 创建一个新的 Rust 项目
cargo new --lib add

# 编辑 Cargo.toml 文件
[package]
name = "add"
version = "0.1.0"
edition = "2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"

# 编辑 src/lib.rs 文件
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
  fn alert(s: &str);
}

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
  a + b
}
}

# 编译成 WebAssembly 模块
wasm-pack build --target web

加载和使用 WebAssembly 模块

在 JavaScript 中加载和使用 WebAssembly 模块非常简单。以下是一个示例:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebAssembly Example</title>
</head>
<body>
  <script type="module">
    import init, { add } from './pkg/add.js';

    async function run() {
      await init();
      const result = add(1, 2);
      console.log('Result:', result);
    }

    run();
  </script>
</body>
</html>

与 JavaScript 交互

WebAssembly 模块可以与 JavaScript 代码进行双向通信。以下是一些常见的交互方式:
从 JavaScript 调用 WebAssembly 函数
// JavaScript 代码
import init, { add } from './pkg/add.js';

async function run() {
  await init();
  const result = add(1, 2);
  console.log('Result:', result);
}

run();
从 WebAssembly 调用 JavaScript 函数
// Rust 代码
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
  fn alert(s: &str);
}

#[wasm_bindgen]
pub fn greet(name: &str) {
  alert(&format!("Hello, {}!", name));
}
<!-- HTML 代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebAssembly Example</title>
</head>
<body>
  <script type="module">
    import init, { greet } from './pkg/greet.js';

    async function run() {
      await init();
      greet('World');
    }

    run();
  </script>
</body>
</html>

实际案例

图像处理
WebAssembly 可以用于图像处理,例如将图像转换为灰度图像。以下是一个使用 Rust 编写的 WebAssembly 模块示例:

// grayscale.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn grayscale(image_data: &[u8], width: usize, height: usize) -> Vec<u8> {
  let mut result = vec![0; image_data.len()];
  for y in 0..height {
    for x in 0..width {
      let offset = (y * width + x) * 4;
      let r = image_data[offset] as f32;
      let g = image_data[offset + 1] as f32;
      let b = image_data[offset + 2] as f32;
      let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8;
      result[offset] = gray;
      result[offset + 1] = gray;
      result[offset + 2] = gray;
      result[offset + 3] = image_data[offset + 3];
    }
  }
  result
}
<!-- HTML 代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebAssembly Image Processing</title>
</head>
<body>
  <canvas id="canvas" width="500" height="500"></canvas>
  <script type="module">
    import init, { grayscale } from './pkg/grayscale.js';

    async function run() {
      await init();
      const canvas = document.getElementById('canvas');
      const ctx = canvas.getContext('2d');
      const image = new Image();
      image.src = 'path/to/image.jpg';
      image.onload = () => {
        ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
        const result = grayscale(imageData.data, canvas.width, canvas.height);
        const newImageData = new ImageData(new Uint8ClampedArray(result), canvas.width, canvas.height);
        ctx.putImageData(newImageData, 0, 0);
      };
    }

    run();
  </script>
</body>
</html>

总结

通过本文,你已经学会了如何使用 WebAssembly 优化 Web 应用性能。WebAssembly 的高性能、小体积和安全性使其成为现代 Web 开发的重要工具。
WebAssembly 架构图

WebAssembly 可以在浏览器中以接近原生的速度运行,同时与 JavaScript 无缝集成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】自定义类型(结构体、枚举、联合的详解)下

写在前面 书接上回&#xff1a;【C语言】自定义类型&#xff08;结构体、枚举、联合的详解&#xff09;上 在上中&#xff0c;不才独篇撰写了结构体的具体细节&#xff0c;本篇笔记主要是把剩下的自定义类型全部展示。 文章目录 写在前面二、位段2.1、位段的定义2.2、位段占用…

初始JavaEE篇 —— 文件操作与IO

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 文件介绍 Java标准库中提供操作文件的类 文件系统操作 File类的介绍 File类的使用 文件内容操作 二进制文件的读写操作…

CSP 2024 入门级第二轮 CSP-J 2024 复赛 第一题 扑克牌

一、题目阅读 [CSP-J 2024] 扑克牌 - 洛谷 二、题目解析 输入 去重 三、题目代码 #include <bits/stdc.h> using namespace std;int main() {map<string, bool> flag;int n, res 52;cin >> n;while (n--) {string s;cin >> s;if (!flag[s]) { // …

面试题:JVM(二)

1. 面试题 简述 Java 类加载机制?&#xff08;百度&#xff09; JVM类加载机制 &#xff08;滴滴&#xff09; JVM中类加载机制&#xff0c;类加载过程&#xff0c;什么是双亲委派模型&#xff1f; &#xff08;腾讯&#xff09; JVM的类加载机制是什么&#xff1f; &#x…

AUTOSAR CP MCAL微控制器抽象层介绍

AUTOSAR(Automotive Open System Architecture)即汽车开放系统架构,它将汽车电子控制单元(ECU)的软件底层做了一个标准的封装,使得开发者能够共用一套底层软件,并通过修改参数来匹配不同的硬件和应用层软件。AUTOSAR CP(Classic Platform)是AUTOSAR架构中的一个重要组…

ElastricSearch 原理以及简单实用(超级通俗)

提到非结构化数据的检索&#xff0c;常常用到 ElasticSearch&#xff0c;他是什么呢&#xff1f; ElasticSearch 是一个基于 Apache Lucene 的分布式搜索引擎&#xff0c;可以作为实时文档存储系统&#xff0c;且文档的每一个内容都可以被检索&#xff0c;能够处理 PB 级别的结…

在线培训知识库:企业培训的新篇章

在当今快节奏的商业环境中&#xff0c;员工培训已成为企业保持竞争力的关键。在线培训知识库作为一种新兴的培训工具&#xff0c;正逐渐成为企业培训体系的核心。它不仅能够提供灵活的学习方式&#xff0c;还能确保培训内容的及时更新和高效传播。本文将探讨在线培训知识库的重…

简单的kafkaredis学习之kafka

简单的kafka&redis学习整理之kafka 1. kafka 1.1 什么是消息队列 在学习Kafka之前我们先来看一下什么是消息队列&#xff0c;消息队列(Message Queue)&#xff1a;可以简称为MQ 例如&#xff1a;Java中的Queue队列&#xff0c;也可以认为是一个消息队列 消息队列&#x…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

集成框架 -- 自定义二方包 starter

自定义starter 二方包 My-thread-pool-startermy-thread-pool-starter 整体架构 测试 MyTestAppApplication测试工程 my-test-app 结构测试项目的 pom.xml 二方包 My-thread-pool-starter POM 文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

如何看待AI技术的应用前景?

文章目录 如何看待AI技术的应用前景引言AI技术的现状1. AI的定义与分类2. 当前AI技术的应用领域 AI技术的应用前景1. 经济效益2. 社会影响3. 技术进步 AI技术应用面临的挑战1. 数据隐私与安全2. 可解释性与信任3. 技能短缺与就业影响 AI技术的未来发展方向1. 人工智能的伦理与法…

华为擎云(银河麒麟V10+麒麟9000C CPU)电脑总是弹出“选择新密钥环的密码”(20241030)

症状如下图&#xff1a; 网络上一般的解决方法都是安装 seahorse &#xff0c;例如这篇文章:银河麒麟系统清除桌面密钥环 不知道为什么&#xff0c;这对我的这台电脑并不可行。 麒麟系统用的是 Gnome 桌面。这个“密钥环”的弹出框是由 gnome-keyring-daemon 弹出的。这是一个…

[SICTF Round4] PWN

这PWN题似乎是给我出的&#xff0c;4个一血1个2血。密码又过于简单。逆向太难了又不大会。 Stack fengshui main可以溢出覆盖rbpret所以它每一步都需要移栈。 可用的ROP里没有pop rdi,在4004c0里有错位的01 5d c3 &#xff1a;add DWORD PTR [rbp-0x3d], ebx 并且有对应的p…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

2025浙江省考报名流程详细教程

2025年浙江省考报名马上就要开始了&#xff0c;有想要参加浙江省考的同学&#xff0c;可以提前看一下报名流程&#xff0c;和报名照要求。 报名时间&#xff1a;11月6日9时一11月11日17时 南核时间&#xff1a;11月6日9时一11月13日17时 缴费时间&#xff1a;11月14日9时一11月…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(一)

刚开始接触HarmonyOS的开发&#xff0c;希望不会太晚。在我学习的过程中&#xff0c;我会将我学到的内容&#xff0c;通过写博客的形式&#xff0c;来进行回忆和复习。同时也希望能够遇到志同道合的朋友&#xff0c;我们一起学习&#xff0c;一起进步&#xff0c;文章中有什么不…

shell脚本案例:创建用户和组

使用场景 在部署程序时&#xff0c;往往首要任务是创建用户和组。有的程序可能用到的组、用户比较多&#xff1b;且不知道服务器环境是否已经有了所需的组和用户。所以针对这个情况&#xff0c;根据Oracle RAC部署时的实际情况写了个脚本。 Linux版本 脚本代码 #!/bin/bash …

【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式 1.适配器模式&#xff08;Adapter&#xff09;2.装饰器模式&#xff08;Decorator&#xff09;2.1 主要特点2.2 组成部分2.3 示例代码2.3.1 Component 组件2.3.2 ConcreteComponent 具体组件2.3.3 Dec…

交换机的基本配置

交换机的基本配置 实验题目实验目的实验任务实验设备实验环境实验步骤VLAN 的简单配置跨交换机 vlan 的配置主机配置信息表解释&#xff1a; vlan 间路由 实验题目 交换机的基本配置。 实验目的 1) 理解交换机的原理和应用场景&#xff1b; 2) 交换机的基本指令系统&#xf…