1 个不稳定版本
0.1.0 | 2021 年 10 月 10 日 |
---|
#2350 在 数据结构
38KB
653 行
retrace
本包实现了一个安全、通用的可预测延迟回滚日志。
[dependencies]
retrace = "0.1.0"
Retrace
类型被实现为一个扁平块的不可锁链表。为了保持插入延迟的可预测性,它简单地缓冲它们,而不将它们应用于“尖端”状态,直到有足够的意图来处理一个块。然后构建块,将其 prepends 到链表中,并在大多数情况下在后台任务中实际产生尖端的状态。一旦完成,这个结果就被原子地放回到列表中,而不会影响现有的读者并加快后续查询的速度。
本包只包含安全代码,并声明了 #[forbid)
。
使用场景
本包的编写考虑了以下特性的用例,你的使用情况可能会有所不同
- 追加操作必须快,并且不应有延迟峰值。
- 追加操作是逐渐发生的,而不是一次性完成的。
- 只要它不阻塞主线程,浪费一些 CPU 周期是可以接受的。
示例
use retrace::{Retrace, Reproducible, Options};
// For the example, a simple integer is used as state. A real world example
// would have a much more complex structure in place of this.
#[derive(Clone, PartialEq, Eq, Debug)]
struct Foo(i32);
impl Reproducible for Foo {
type Intent = i32;
type Error = ();
fn apply(&mut self, intent: &Self::Intent) -> Result<(), Self::Error> {
self.0 += *intent;
Ok(())
}
}
let mut retrace = Retrace::new(Foo(0), Options::default());
for i in 1..=100 {
retrace.append(i);
}
for i in (1..=100).rev() {
assert_eq!(
Foo((1 + i) * i / 2),
retrace.eval((100 - i) as usize).unwrap()
);
}
功能
std
: 默认启用。将NativeSpawner
设置为默认的Spawner
。禁用此默认功能以支持no-std
。
基准测试
$ cargo install cargo-criterion # if you haven't yet
$ cargo criterion --features=bench
由于缓存对于 retrace
是至关重要的,因此仅使用公共 API 难以对冷性能进行基准测试。 bench
功能提供了 Retrace::decache
方法,该方法用于基准测试冷查询性能。这对于任何其他目的都不是非常有用,并且除非用于基准测试,否则不应使用。
依赖关系
~185KB