提示:本网站现在为维护调试状态

WebAssembly 入門:Rust 編譯 WASM + JS 調用

Choyeon
Choyeon
2026年9月1日 1 分鐘閱讀 639 閱讀
479 字 1,424 字元 更新於 2026年11月8日
WebAssembly 入門:Rust 編譯 WASM + JS 調用
目錄

WebAssembly 入门:Rust 编译 WASM + JS 调用

前端遇到图像/矩阵/密码学等 CPU 密集任务时,JS 性能成瓶颈。WebAssembly 让 Rust 代码编译为接近原生速度的字节码。

工具链与基础绑定

安装 wasm-pack 后,用 #[wasm_bindgen] 宏把 Rust 函数导出为 JS 可调用形式。复杂结构用 serde + serde_wasm_bindgen 序列化跨语言传递。

use wasm_bindgen::prelude::*;
use serde::{Serialize, Deserialize};
use web_sys::console;

#[derive(Serialize, Deserialize)]
pub struct MatrixResult { rows: usize, cols: usize, data: Vec<f64>, compute_ms: f64 }

#[wasm_bindgen(start)]
pub fn init() {
    console_error_panic_hook::set_once();
    console::log_1(&"[WASM] Matrix module loaded".into());
}

#[wasm_bindgen]
pub fn matrix_multiply(a_ptr: *mut f64, a_rows: usize, a_cols: usize, b_ptr: *mut f64, b_cols: usize) -> JsValue {
    use std::time::Instant;
    let t0 = Instant::now();
    let a = unsafe { std::slice::from_raw_parts(a_ptr, a_rows * a_cols) };
    let b = unsafe { std::slice::from_raw_parts(b_ptr, a_cols * b_cols) };
    let mut c = vec![0.0f64; a_rows * b_cols];
    for i in 0..a_rows {
        for k in 0..a_cols {
            let aik = a[i * a_cols + k];
            let rb = &b[k * b_cols..(k + 1) * b_cols];
            let rc = &mut c[i * b_cols..(i + 1) * b_cols];
            for j in 0..b_cols { rc[j] += aik * rb[j]; }
        }
    }
    let r = MatrixResult { rows: a_rows, cols: b_cols, data: c, compute_ms: t0.elapsed().as_secs_f64() * 1000.0 };
    serde_wasm_bindgen::to_value(&r).unwrap()
}

#[wasm_bindgen]
pub fn fibonacci_iter(n: u32) -> u64 {
    if n <= 1 { return n as u64; }
    let (mut prev, mut curr) = (0u64, 1u64);
    for _ in 2..=n { let next = prev.saturating_add(curr); prev = curr; curr = next; }
    curr
}

#[wasm_bindgen(js_name = "allocateFloat64Array")]
pub fn allocate_f64(len: usize) -> *mut f64 {
    let mut v = Vec::with_capacity(len);
    let p = v.as_mut_ptr();
    std::mem::forget(v);
    p
}

JS 调用与内存共享

WASM 内存是共享 ArrayBuffer,通过 TypedArray 视图直接读写比参数序列化快 10-100 倍。大数据时直接分配内存给 JS 端填充,再传指针和尺寸给 WASM。

对比项 纯 JS WASM (Rust) 加速倍数 适用场景
矩阵乘法 1024x1024 ~1800ms ~85ms ~21x 3D/游戏/AI推理
Fibonacci(n=40) ~980ms ~8ms ~120x 数学计算
SHA-256 1MB ~42ms ~6ms ~7x 密码学/校验

最佳实践

适合计算密集型循环,不要做 DOM 操作。优先 TypedArray 共享内存而非大对象参数,发布构建用 wasm-opt 优化体积。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

留言 (3)

0 / 3000
AI炼丹学徒
AI炼丹学徒2026年9月29日

补充一点:实际使用中如果遇到 MySQL 的 8 小时超时问题,可以在连接串里加 autoReconnect=true 参数,虽然官方不推荐但挺好用的。

画画的小鱼
画画的小鱼fishgallery.art2026年9月29日

哈哈,楼主的踩坑经历和我一模一样!我当时就是没注意到这个配置,排查了整整两天,看到这篇文章泪目了。

熬夜攻城狮
熬夜攻城狮nightowl.tech2026年9月28日

受益匪浅,感谢大佬分享!

相關文章

Rust 所有權與借用機制:徹底理解生命週期

Rust 所有權與借用機制:徹底理解生命週期

系統攻克 Rust 最獨特概念:所有權規則、可變/不可變借用約束、引用生命週期標註。通過編譯錯誤示例 + 修復方案,徹底掌握借用檢查器思維方式,寫出安全零抽象開銷的系統代碼。

1 分鐘閱讀
Linux 性能調優:perf_events + bpftrace + BCC

Linux 性能調優:perf_events + bpftrace + BCC

從 CPU、內存、IO、網絡四個維度,使用 perf_events 採樣堆棧、bpftrace 一行腳本追蹤內核點、BCC 工具集 biolatency/offcputime,快速定位生產服務器性能瓶頸,附真實排查思路。

1 分鐘閱讀
TypeScript 高級類型體操

TypeScript 高級類型體操

TypeScript 的類型系統堪比一門完整的編程語言。本文系統講解條件類型、映射類型、模板字面量類型、infer 推斷、遞歸類型、分佈式條件類型等高階特性。配合 15+ 真實工具類型實現(DeepPartial、PathOf、PickByType、CamelCase 等),帶你掌握 type-challenges 中級難度以上的解題思路。

1 分鐘閱讀
PostgreSQL 查詢優化技巧

PostgreSQL 查詢優化技巧

深入掌握 PostgreSQL 查詢優化的核心方法:從 EXPLAIN ANALYZE 執行計劃解讀,到索引類型選擇(B-tree/GIN/BRIN)、統計資訊更新、連接策略調整、分區表設計,全方位提升數據庫查詢性能。

1 分鐘閱讀
Zero Trust 安全架構入門:永不信任,始終驗證

Zero Trust 安全架構入門:永不信任,始終驗證

零信任安全模型系統入門:以"永不信任,始終驗證"為核心原則,打破傳統邊界防護(VPN=內部可信)的思維。從身份認證(MFA/SAML)、設備健康檢查、最小權限 RBAC、微隔離 mTLS、持續信任評分到可觀測審計鏈路的 6 大支柱詳解,附落地實施路線。

1 分鐘閱讀
測試金字塔:單元/整合/E2E 測試比例與落地

測試金字塔:單元/整合/E2E 測試比例與落地

系統解析測試金字塔架構:從底層單元測試(大量快速、Mock 隔離依賴)、中層整合測試(服務/數據庫/消息協作真實交互)、頂層 E2E 測試(真實用戶路徑少量精測)的推薦比例 70% / 20% / 10%,附項目覆蓋率指標與落地實踐。

1 分鐘閱讀