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日

#1443Rust模式

Download history 7622/week @ 2024-03-14 2331/week @ 2024-03-21 19384/week @ 2024-03-28 3275/week @ 2024-04-04 4452/week @ 2024-04-11 4641/week @ 2024-04-18 4385/week @ 2024-04-25 3102/week @ 2024-05-02 2483/week @ 2024-05-09 10660/week @ 2024-05-16 10323/week @ 2024-05-23 4022/week @ 2024-05-30 10501/week @ 2024-06-06 6231/week @ 2024-06-13 6340/week @ 2024-06-20 8005/week @ 2024-06-27

32,099 每月下载量
7 个crate中使用 (3 个直接使用)

MIT 许可证

17KB
251 代码行

Rust

释放未使用值的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特质约束的任何数据类型。
  • 安全:这个库建立在 ArcDashMap 类型之上,不包含任何不安全代码。

示例

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