6 个版本 (破坏性)
使用旧的 Rust 2015
0.4.0 | 2018 年 7 月 12 日 |
---|---|
0.3.0 | 2018 年 5 月 15 日 |
0.2.0 | 2017 年 8 月 30 日 |
0.1.2 | 2016 年 5 月 12 日 |
0.0.1 | 2015 年 5 月 5 日 |
#982 在 并发
每月 48 次下载
用于 4 个 Crates(3 个直接使用)
255KB
348 代码行
有限制的 SPSC 队列
此 crate 为 Rust 提供了一个非常简单的有限制的、单生产者单消费者(SPSC)队列。它提供了一种数据结构,使得两个线程可以在一个方向上以最小的开销和有限制的语义进行通信。
与 sync_channel
相比,此队列提供了一些小的但一致的加速。在内部,sync_channel
使用一个无界的链表数据结构,而 bounded_spsc_queue
是一个简单的环形缓冲区,具有一个连续的分配内存块。连续的内存块由于减少了指针间接引用,允许更好的缓存预取,并且通常操作更简单,以实现有限制的 SPSC 队列。
文档
示例
use std::thread;
use bounded_spsc_queue::{Producer, Consumer};
// Initialize a queue with capacity of 500 values
let (p, c) = bounded_spsc_queue::make(500);
// Spawn a new thread and move the Producer into it
thread::spawn(move|| {
for i in 0..100000 {
p.push(i);
}
});
// Back in the first thread, start pop'ing values off the queue
for i in 0..100000 {
let t = c.pop();
assert!(t == i);
}
半科学基准测试
在我的 Macbook Air(双核 1.7 GHz 英特尔酷睿 i7)上,sync_channel
可以在 ~200ns 内执行单线程 send()/recv()
配对操作。
spsc
在 ~10ns 内执行相同的测试。
一个更现实,尽管更难准确基准测试的测试是线程性能。此测试启动一个“监听器”线程,该线程试图尽可能快地清空队列。它必须间歇性地检查一个原子标志以确定测试是否结束,这不幸地会影响基准测试结果。为了减轻这种影响,监听器将仅在每 500 次迭代时检查一次。
在原始线程中,基准测试器尝试将数据推送到队列中。这就是计时可能会出现问题时:如果监听器不足以快速清空队列,生产者可能因等待队列释放空间而停滞。这个测试不应被视为延迟测试,而应更多地被视为吞吐量测试,因为它实际上是在测试生产者和消费者性能的结合。
sync_channel
在这个测试中的得分约为 ~6μs
而 spsc
的得分约为 ~20ns
另一组基准测试关注的是逆操作(次要线程持续向队列中推送,而主线程从队列中弹出数据)。时间非常相似。
换一种说法
- SPSC每秒执行约50m次推送操作
- 同步通道每秒执行约170k次操作