1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2015年11月25日

#5 in #bc

MIT 许可证

8KB
75

bcount

Build Status code coverage

此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

无运行时依赖