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

WebAssembly 入門:Rust → WASM + JS 呼び出し

Choyeon
Choyeon
2026年9月1日 1 分で読了 641 閲覧
366 字 1,811 文字 更新日 2026年11月8日
WebAssembly 入門:Rust → WASM + JS 呼び出し
目次

Getting Started with WebAssembly: Rust to WASM + JS Interop

For CPU-heavy tasks like image/matrix/crypto in browser, JS hits performance limits. WASM compiles Rust to near-native bytecode running in every modern browser.

Toolchain and Basic Bindings

Install wasm-pack and use #[wasm_bindgen] to export Rust functions callable from JS. Complex structs cross via serde + serde_wasm_bindgen serialization.

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 Invocation and Memory Sharing

WASM memory is a shared ArrayBuffer; reading/writing through TypedArray views is 10-100x faster than serialization. Allocate from JS into WASM memory then pass pointers/sizes for large data.

Metric Plain JS WASM (Rust) Speedup Best For
Matmul 1024x1024 ~1800ms ~85ms ~21x 3D/Games/AI
Fibonacci(n=40) ~980ms ~8ms ~120x Math workloads
SHA-256 1MB ~42ms ~6ms ~7x Crypto/Checksums

Best Practices

Target compute-heavy loops, not DOM work. Prefer TypedArray memory sharing for large data over serialized parameters. Use wasm-opt on release builds to shrink binary size.

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の最難解概念をマスター:所有権ルール、可変/不変借用の制約、ライフタイム注釈。コンパイルエラー例と修正を通してBorrow Checkerの思考法を習得。

1 分で読了
Linux 性能チューニング:perf + bpftrace + BCC

Linux 性能チューニング:perf + bpftrace + BCC

CPU/メモリ/IO/ネットワーク4次元:perfによるサンプリング、bpftraceワンライナー、BCC biolatency/offcputimeを用いた本番ボトルネック特定とトラブルシューティング。

1 分で読了
TypeScript 高度な型体操

TypeScript 高度な型体操

TypeScript の型システムは、完全なプログラミング言語に匹敵します。この記事では、条件型、マッピング型、テンプレートリテラル型、infer による推論、再帰型、分散条件型などの高機能を体系的に解説します。15 以上の実用ユーティリティ型の実装を通じて、type-challenges 中級以上の解法アプローチを習得しましょう。

1 分で読了
PostgreSQL クエリ最適化テクニック

PostgreSQL クエリ最適化テクニック

PostgreSQLクエリ最適化:EXPLAIN ANALYZEの読み方、インデックス種別選択、統計情報更新、結合戦略調整、パーティションテーブル設計。

1 分で読了
Zero Trust セキュリティアーキテクチャ入門:決して信用せず、常に検証

Zero Trust セキュリティアーキテクチャ入門:決して信用せず、常に検証

Zero Trust セキュリティモデル体系入門:「決して信用せず、常に検証」を原則に、伝統的 VPN=内部信頼の境界防衛思考を打ち砕く。身元認証(MFA/SAML)、端末健康チェック、最小権限RBAC、マイクロセグメンテーションmTLS、継続的信用スコア、可視化監査ログの6本柱を解説、実装ロードマップ付き。

1 分で読了
テストピラミッド:単体/結合/E2E 比率と実践

テストピラミッド:単体/結合/E2E 比率と実践

テストピラミッド体系解説:下層 単体テスト(多数・高速・Mock分離)、中層 結合テスト(実DB/メッセージ協調)、上層 E2E(少数・重要ユーザーフロー)。推奨比率 70/20/10、カバレッジ指標と実践ガイド。

1 分で読了