#arena #object #stable #retain #clear #iterate #reference

rustc-arena-modified

将rustc-arena迁移到稳定版Rust并增加了新特性

2个版本

0.1.1 2023年7月12日
0.1.0 2023年7月4日

#308 in 内存管理


btree-plus-store 中使用

MIT/Apache

1.5MB
2K SLoC

rustc-arena-modified: 将rustc-arena迁移到稳定版Rust并增加了新特性

CI Crate information License Documentation

rustc_arena 分支出来

你为什么想要这个?

  • 在竞技场中分配对象可能比常规分配更快
  • 竞技场同时也是一个集合,您可以在共享引用的后面插入对象。与其复制对象并可能使用 Rc,不如使用 Arena 并复制引用。

关于 typed-arenabumpalo 呢?

  • rustc_arena_modified::TypedArena 允许合并和清除可变引用后面的对象,同时保存块以便不需要重新分配。这相当于调用 into_vec 然后将向量转换回竞技场,但更快,因为您不需要分配任何内容。
  • rustc_arena_modified::TypedArena 根据基准测试在迭代方面也显著更快(其他差异可以忽略不计;见基准测试
  • rustc_arena_modified::TypedArena 返回分配值的共享引用,因此它可以迭代共享引用后面的值,就像 typed-arena-nomut 一样。与 typed-arena-nomut 不同,它还可以在 rustc_arena_modified::TypedArenaMut 之间进行空操作转换,这是相同的,但返回可变引用。此外,您还可以在共享竞技场的可变引用中获得迭代可变元素引用,因为这确保没有活动的共享引用。
  • 《slab》功能提供了《SlabArena》,它是《rustc_arena_modified::TypedArena》的封装,使其能够跟踪链表中的释放元素,以便回收它们的内存。这带来了一些缺点,比如无法在空闲列表中分配切片(??:允许切片分配,只是让它不成为空闲列表的一部分?)
  • 待办事项:比较《DroplessArena》和《Bump》(注意:也许《Bump》在客观上更好)

它是什么?

rustc_arena移植到稳定版Rust,并具有以下新功能:

  • TypedArena::iter 以遍历竞技场中的所有对象
  • TypedArena::retainTypedArena::clear,以合并清除可变引用后面的对象,同时保留块,以便它们不需要重新分配。

安全性

该库大量使用unsafe,并且没有使用MIRI进行完全测试。大多数操作和边缘情况都有测试,基本功能几乎直接从经过充分测试的《rustc_arena》复制而来。但额外功能测试较少,尤其是在大量使用unsafe的情况下,它不应该在生产中使用。

基准测试

总体而言,性能与《rustc_arena》和《typed_arena》大致相同,但迭代速度比《typed_arena》快得多。《slab_arena》的表现明显较慢。

完整报告

alloc alloc_from_iter iter into_vec

许可

根据您的选择,在以下两种许可下提供许可:

  • Apache License,版本2.0(《LICENSE-APACHE》或《https://apache.ac.cn/licenses/LICENSE-2.0》)
  • MIT许可(《LICENSE-MIT》或《http://opensource.org/licenses/MIT》)

rustc-arena(《Github》)分支,它也根据MIT“或”Apache 2.0许可。

贡献

除非您明确表示,否则根据Apache-2.0许可定义,您提交的任何有意包含在工作中的贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖关系