11个版本 (6个破坏性版本)
0.7.0 | 2021年12月1日 |
---|---|
0.6.0 | 2021年11月26日 |
0.5.1 | 2021年4月19日 |
0.5.0 | 2020年7月16日 |
#1443 在 Rust模式
32,099 每月下载量
在 7 个crate中使用 (3 个直接使用)
17KB
251 代码行
释放未使用值的intern器。
这个crate是David Roundy的internment crate的分支。它提供了一个替代的internment::ArcIntern
类型的实现。它继承了David的高级设计和API;然而,它完全基于Rust的标准Arc
类型和dashmap
crate构建,不包含任何不安全代码。
Interning通过存储每个不同值的唯一副本来减少应用程序的内存占用。它加快了相等比较和哈希操作的速度,因为只需要比较指针而不是实际值。另一方面,对象创建较慢,因为它涉及到在interned对象池中进行查找。
Interning最常用于字符串;然而,它也可以用于其他对象类型。这个库支持任意对象的interning。
存在几个针对Rust的interning库,每个库都有自己的权衡。这个库做出了以下设计选择
- Interned对象是引用计数的。当最后一个引用到interned对象的引用被丢弃时,该对象将被释放。这防止了在动态改变interned值集的应用程序中interned对象池的无限制增长,但这会带来一些CPU和内存开销(由于存储和维护原子计数器)。
- 多线程。程序中的所有线程共享一个单个的interned对象池。该池作为
DashMap
实现,以实现安全并发访问和低争用。 - 不仅仅是字符串:这个库允许intern满足
Eq + Hash + Send + Sync
特质约束的任何数据类型。 - 安全:这个库建立在
Arc
和DashMap
类型之上,不包含任何不安全代码。
示例
use arc_interner::ArcIntern;
let x = ArcIntern::new("hello");
let y = ArcIntern::new("world");
assert_ne!(x, y);
assert_eq!(x, ArcIntern::new("hello"));
assert_eq!(*x, "hello"); // dereference an ArcIntern like a pointer
依赖项
~425–740KB
~16K SLoC