zaw
Zero Allocation WASM @ Style Arcade
The purpose of zaw is to make it easier to achieve the original promise of WebAssembly:
High-performance, low-overhead acceleration for targeted code - without rewriting your entire application.
🎯 The upshot
With zaw, you'll be able to offload individual algorithms, rather than entire modules, and keep your WebAssembly code lean and simple - truly unlocking the original vision of the WebAssembly founding team.
🚀 Performance
Up to 7x faster than pure JavaScript and 2.5x faster than wasm-bindgen for XOR Int32Array Bench
| Element Count | Winner | vs zaw |
vs js |
vs wasm-bindgen |
|---|---|---|---|---|
| 10 | js |
1.9x faster | - | 4.2x faster |
| 100 | zaw |
- | 1.4x faster | 2.2x faster |
| 1,000 | zaw |
- | 5.6x faster | 2.5x faster |
| 10,000 | zaw |
- | 7.1x faster | 2.3x faster |
| 100,000 | zaw |
- | 7.1x faster | 2.4x faster |
📦 Installation
Add to your Cargo.toml:
[]
= "0.1"
For WebAssembly targets, also add:
[]
= ["cdylib"]
🔥 Quick Start
Here's how to sum an array of Float64s using zaw.
This won't actually be fast; check out the example implementations to see what this looks like with full SIMD & batching.
Host Implementation
Typescript
import { createInstance } from 'zaw'
// Low-level WASM API
type WasmExports = {
sumFloat64Array: () => 0 | 1 // 0 = OK, 1 = Error
}
// High-level API with bindings
type WasmApi = {
sumFloat64Array: (values: Float64Array) => number
}
export async function initWasmApi(wasmBuffer): Promise<WasmApi> {
const instance = await createInstance<WasmExports>(wasmBuffer, {
// Reserve 1kb for both input and output channels
inputChannelSize: 1_000,
outputChannelSize: 1_000,
})
return {
sumFloat64Array: instance.bind(
// The exported function to bind to
instance.exports.sumFloat64Array,
// Input binding: copy values into WASM (zero allocation)
(input, [values]) => input.copyFloat64Array(values),
// Output binding: read the sum from the output channel
output => output.readFloat64(),
),
}
}
// Load your WASM module
const api = await initWasmApi(wasmBuffer)
const numbers = new Float64Array([1.5, 2.3, 3.7, 4.1])
const sum = api.sumFloat64Array(numbers)
console.log('Sum:', sum) // 9.5
WASM Implementation
use interop;
use ;
// Setup all required WASM interop exports
setup_interop!;
pub extern "C"
Error Handling
pub extern "C" myFunction