2 unstable releases

0.6.0 Aug 31, 2024
0.4.2 Dec 22, 2023

#84 in Memory management

Download history 436/week @ 2024-07-04 417/week @ 2024-07-11 702/week @ 2024-07-18 395/week @ 2024-07-25 646/week @ 2024-08-01 1036/week @ 2024-08-08 850/week @ 2024-08-15 1083/week @ 2024-08-22 1205/week @ 2024-08-29 1318/week @ 2024-09-05 1393/week @ 2024-09-12 1280/week @ 2024-09-19 611/week @ 2024-09-26 1564/week @ 2024-10-03 6606/week @ 2024-10-10 1256/week @ 2024-10-17

10,283 downloads per month
Used in 6 crates

MIT/Apache

7KB
59 lines

mini-alloc

mini-alloc is a small and performant allocator optimized for wasm32 targets like Arbitrum Stylus. You can use it in your program as follows.

#[global_allocator]
static ALLOC: mini_alloc::MiniAlloc = mini_alloc::MiniAlloc::INIT;

Benchmarks

mini-alloc implements a minimal bump allocator strategy. It never deallocates memory -- that is, dealloc does nothing. It's suitable for cases where binary size is at a premium and it's acceptable to leak all allocations. The simplicity of this model makes it very efficient, as seen in the following benchmarks.

MiniAlloc WeeAlloc Std Library
alloc 333 gas 721 gas 516 gas
alloc_zeroed 329 gas 95 million gas 48 million gas

The benchmarks compare the performance of this crate's edge_cases test in the Stylus VM. Normal allocations are over 2x cheaper than when using WeeAlloc, a common WASM alternative that this crate defaults to when built for non-WASM targets.

Replacing each instance of alloc in the test with alloc_zeroed reveals an over 99% improvement for zero-filled allocations. Unlike WeeAlloc and the standard library, MiniAlloc takes advantage of the fact that WASM pages are zero-filled at initialization, and uses fewer of them due to the layout of Rust's memory.

In the above tests we disable memory expansion costs, which unfairly penelize WeeAlloc and the standard library due to their increased resource consumption.

Notice

MiniAlloc should not be used in wasm32 environments that enable the multithreading proposal. Although MiniAlloc implements Sync since Rust requires it for the global allocator, this crate should not be used in this way. This should not be a concern in Stylus.

Also, core::arch::wasm32::memory_grow must never be called by any code outside this crate.

License

© 2023-2024 Offchain Labs, Inc.

This project is licensed under either of

at your option.

The SPDX license identifier for this project is MIT OR Apache-2.0.

Dependencies

~4KB