8 个版本
0.2.4 | 2023 年 6 月 4 日 |
---|---|
0.2.3 | 2023 年 5 月 17 日 |
0.2.2 | 2023 年 3 月 4 日 |
0.2.1 | 2023 年 2 月 23 日 |
0.1.5 | 2023 年 2 月 18 日 |
#144 在 并发
每月 933 次下载
用于 12 个 Crates (6 个直接)
55KB
571 行
RcLite:小型、快速且内存友好的引用计数
RcLite 是 Rust 的轻量级引用计数解决方案,可作为标准库引用计数的替代品。它提供多线程和单线程引用计数选项,具有改进的性能和降低的内存开销,与标准库引用计数相比,内存开销至少降低 50%,最高降低 100%。当不需要弱引用且优化性能和内存使用是优先考虑时,RcLite 是一个合适的选择。
为什么使用 RcLite?
- 它更快、更小
- 占用更少内存
- 它为标准库的
std::sync::Arc
和std::rc::Rc
提供轻量级的替代方案 - 它支持使用 extern alloc 的
no_std
为什么不适合使用 RcLite?
- 它不提供弱引用
- 它不支持数据作为 DSTs
- 在 64 位系统上使用 RcLite,您只能对一个对象有
4,294,967,296 - 256
个活动引用,这需要大约 32GB 的内存来存储对单个对象位置的这些引用。如果您需要对一个对象有18,446,744,073,709,551,616
个活动引用,请使用标准库。在其他具有较小指针大小(如 32 位)的系统上,您将面临与标准库相同的usize::MAX
活动引用限制。
比较
rclite::{Arc,Rc} | std::*::{Arc,Rc} | |
---|---|---|
64 位系统中的开销 | 4 字节 | 16 字节 |
32位系统中的开销 | 4或2字节 | 8字节 |
16位系统中的开销 | 2或1字节 | 4 字节 |
弱引用 | ❌ | ✅ |
DST支持 | ❌ | ✅ |
在64位系统中,RcLite相对于标准库中的Arc具有优势,因为它可以利用内存填充区域,仅使用4字节来存储计数器。这导致内存使用量减少,因为填充上的内存浪费更少。然而,在结构中可用填充不足的情况下,RcLite的开销为8字节,这仍然是标准库开销的一半。
例如,在64位系统中,Rc<u32>
和Arc<u32>
分配的内存与Box<u32>
相同,因为分配器会将Box<u32>
填充为u64
。
在32位和16位系统中,RcLite的内存开销是标准库的50%。
RcLite的结构类似于一个Box<(T,counter)>
,其中计数器存储在数据之后,而不是像标准库中的第一个字段。这消除了访问数据时进行指针计算的需要,但也限制了RcLite对DST的支持。
特性
默认情况下,RcLite使用64位系统的半个字大小的计数器大小,启用了usize-for-small-platforms
特性。这是因为32位计数器溢出的难度比16位计数器大。如果您希望在其他平台上使用半个寄存器大小,可以通过设置default-features = false
来禁用默认特性。这将导致32位平台上使用16位计数器,16位平台上使用8位计数器。