1 个不稳定版本

0.4.2 2023年12月22日

#192 in 内存管理

Download history 186/week @ 2024-03-14 133/week @ 2024-03-21 278/week @ 2024-03-28 637/week @ 2024-04-04 86/week @ 2024-04-11 51/week @ 2024-04-18 279/week @ 2024-04-25 194/week @ 2024-05-02 377/week @ 2024-05-09 702/week @ 2024-05-16 1186/week @ 2024-05-23 634/week @ 2024-05-30 595/week @ 2024-06-06 916/week @ 2024-06-13 962/week @ 2024-06-20 338/week @ 2024-06-27

2,826 每月下载量
3 crates 中使用

MIT/Apache

8KB
61

mini-alloc

mini-alloc 是一个小巧高效的分配器,针对 wasm32 目标(如 Arbitrum Stylus)进行优化。您可以在程序中使用它,如下所示。

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

基准测试

mini-alloc 实现了一种最小增量分配器策略。它从不释放内存——即,dealloc 不做任何事情。它适用于二进制大小至关重要且可以接受所有分配泄漏的情况。这种模型简单性使得它非常高效,如下面的基准测试所示。

MiniAlloc WeeAlloc 标准库
alloc 333 gas 721 gas 516 gas
alloc_zeroed 329 gas 9500万 gas 4800万 gas

这些基准测试比较了在 Stylus VM 中该Crates的 edge_cases 测试的性能。正常分配的成本比使用WeeAlloc(这是一个常见的WASM替代品,当构建非WASM目标时,该Crates默认使用)高 2倍 以上。

将测试中的每个 alloc 实例替换为 alloc_zeroed 可以揭示零填充分配的改进超过 99%。与 WeeAlloc 和标准库不同,MiniAlloc 利用了WASM页面在初始化时被零填充的事实,并且由于Rust内存布局的原因,使用了更少的页面。

在上面的测试中,我们禁用了内存扩展成本,这不利于 WeeAlloc 和标准库,因为它们的资源消耗增加。

注意

MiniAlloc 不应在启用多线程提议的 wasm32 环境中使用。虽然 MiniAlloc 实现了 Sync,因为 Rust 需要它来使用全局分配器,但这个包不应该以这种方式使用。在 Stylus 中不应担心这个问题。

此外,core::arch::wasm32::memory_grow 不应该由这个包之外的任何代码调用。

在 wasm32 之外的目标上,MiniAlloc 简单地将调用转发到另一个包的分配器,即 wee_alloc::WeeAlloc

许可证

© 2023 Offchain Labs, Inc.

本项目可以在以下任一许可证下使用:

由您选择。

本项目的 SPDX 许可证标识符为 MIT OR Apache-2.0

依赖

~200KB