1 个不稳定版本
0.4.2 | 2023年12月22日 |
---|
#192 in 内存管理
2,826 每月下载量
在 3 crates 中使用
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