1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015年11月25日 |
---|
#5 in #bc
8KB
75 行
bcount
此crate提供用于计数值可变借用类型的类型。类型Bc<T>
是在类型为T
的值之上进行的小包装,它计算自创建以来该值被可变借用过的次数。
为什么?
如果您想缓存昂贵的计算结果,您需要有关计算参数是否更改的信息。您可以使用哈希值来做到这一点,但有两个缺点
- 您需要有实现
Hash
特质的值。一些有用的类型,如f64
,没有; - 您需要有计算哈希值的廉价方式。
如果计算哈希值比实际计算更困难或更昂贵,您就会失败。或者您可以使用Bc<T>
,它将为您提供自上次计算以来借用次数的信息。如果这个数字已更改,那么值很可能已更改,您需要重新执行您的计算。
限制
这不能用作真正的哈希算法,因为即使值没有改变,借用次数也可能改变。
如果发生的借用次数超过usize::MAX
,借用计数器将回绕到0,并且不会因为溢出而panic
。
性能
Bc
类型在借用时不会引入明显的开销。以下是比较原始值和借用计数值基准测试结果
running 2 tests
test counted ... bench: 1,061 ns/iter (+/- 12)
test raw ... bench: 1,059 ns/iter (+/- 16)
使用借用次数作为哈希值比进行实际哈希要快得多。以下是对[usize; 10000]
值的基准测试
running 2 tests
test counted ... bench: 22 ns/iter (+/- 1)
test raw ... bench: 49,011 ns/iter (+/- 755)
您可以在Github上查看这些基准测试的代码。
示例
extern crate bcount;
use bcount::Bc;
fn main() {
let mut a = Bc::new(vec![63, 67, 42]);
assert_eq!(a.count(), 0);
do_work(&mut a);
do_work(&mut a);
do_work(&mut a);
do_work(&mut a);
assert_eq!(a.count(), 4);
*a = vec![3, 4, 5];
assert_eq!(a.count(), 5);
}
fn do_work(_: &mut [usize]) {
// Whatever, nobody cares
}
许可证
MIT