#allocator #global-allocator #operating-system #no-std

nightly no-std frusa

带回收功能的系统分配器

3 个版本

0.1.2 2024年2月29日
0.1.1 2023年12月25日
0.1.0 2023年3月11日

#256内存管理


用于 moto-runtime

MIT/Apache

42KB
969

frusa

快速Rust系统分配器

这是什么?

core::alloc::GlobalAlloc (Rust) 的另一种实现

为什么?

系统分配器应该足够快,应该能够请求更多内存,并允许内存回收。我在2023年初需要它,当时在crates.io上找不到符合要求的任何分配器。

目标

  • 快速且高效的分配/释放小块内存
  • 无std
  • 可以作为 #[GlobalAllocator] 使用
  • 相对简单且高效的扩展/回收

非目标

  • 不关心大内存块:这留给后端分配器处理
  • 成为最快的分配器目前不是目标;相对低开销和高效的回收更重要

那么它是否快速?准备好使用了吗?

  • 目前不如malloc或内核slabs快,但仍然不错
  • 回收工作(按需)
  • 在x64上测试过
  • 未在arm64或其他架构上测试过

一个简单的基准测试

$ cargo test --release concurrent_speed_test -- --nocapture

[...]

------- FRUSA Allocator ---------------
concurrent speed test: 1 threads:   59.48 ns per alloc/dealloc; throughput:  16.81 ops/usec
concurrent speed test: 2 threads:  198.80 ns per alloc/dealloc; throughput:  10.06 ops/usec
concurrent speed test: 4 threads:  465.11 ns per alloc/dealloc; throughput:   8.60 ops/usec
concurrent speed test: 8 threads: 1339.12 ns per alloc/dealloc; throughput:   5.97 ops/usec

------- Rust System Allocator ----------
concurrent speed test: 1 threads:   19.54 ns per alloc/dealloc; throughput:  51.17 ops/usec
concurrent speed test: 2 threads:   22.67 ns per alloc/dealloc; throughput:  88.22 ops/usec
concurrent speed test: 4 threads:   23.47 ns per alloc/dealloc; throughput: 170.44 ops/usec
concurrent speed test: 8 threads:   26.92 ns per alloc/dealloc; throughput: 297.21 ops/usec

------- Talc System Allocator ----------
concurrent speed test: 1 threads:   41.85 ns per alloc/dealloc; throughput:  23.89 ops/usec
concurrent speed test: 2 threads:  311.50 ns per alloc/dealloc; throughput:   6.42 ops/usec
concurrent speed test: 4 threads:  697.42 ns per alloc/dealloc; throughput:   5.74 ops/usec
concurrent speed test: 8 threads: 2196.38 ns per alloc/dealloc; throughput:   3.64 ops/usec

依赖项

~205KB