4 个版本

0.10.3 2024年3月17日
0.10.2 2023年2月7日
0.10.1 2023年2月6日
0.10.0 2023年2月2日

#389 in 并发

MIT 许可协议

33KB
406

SQueue

SQueue 是一个用 Rust 实现的固定大小的队列。

这只是一个简单的包装器,在 标准 Rust VecDeque 之上。它做了一些有见地的选择,以便决定是应该在前端还是后端弹出/推送,并将 API 简化到最低限度,使其只能作为简单的 FIFO 队列。

与使用标准队列相比,主要区别在于这个队列有大小限制,当推送的元素超过其允许的容量时,将丢弃最老的元素。

除此之外,还提供了一个线程安全的同步实现,可以在线程之间共享。但并没有什么疯狂的特性,仅仅是一个简单的包装器。

SQueue icon

该项目源于 HashLRU

状态

SQueue 处于玩具项目和可用项目之间。它附带了一个相当完整的测试框架,并试图有合理的文档,所以这是一个加分项。另一方面,它相当年轻,据我所知,尚未在生产环境中使用。

如有疑问,请使用纯 VecDeque

Build Status Crates.io Gitlab License

使用方法

use squeue::Queue;

let mut queue: Queue<usize> = Queue::new(3);
assert_eq!(None, queue.push(1));
assert_eq!(None, queue.push(2));
assert_eq!(None, queue.push(3));
assert_eq!(Some(1), queue.push(4));
assert_eq!(3, queue.len());

基准测试

来自一个随机的 CI 任务

running 6 tests
test tests::bench_read_usize_builtin_vecdeque   ... bench:           0 ns/iter (+/- 0)
test tests::bench_read_usize_squeue_queue       ... bench:           0 ns/iter (+/- 0)
test tests::bench_read_usize_squeue_sync_queue  ... bench:          16 ns/iter (+/- 0)
test tests::bench_write_usize_builtin_vecdeque  ... bench:          10 ns/iter (+/- 28)
test tests::bench_write_usize_squeue_queue      ... bench:           3 ns/iter (+/- 0)
test tests::bench_write_usize_squeue_sync_queue ... bench:          21 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 0 ignored; 6 measured; 0 filtered out; finished in 11.75s

这不是彻底的基准测试结果,但总体想法是

  • 使用成本低
  • 在某些情况下,可能比使用内置类型更快,我的理解是,由于限制了内存大小,在向其中推送大量项目时,需要更少的内存分配,因为它们会被丢弃
  • 同步版本如预期的那样显著较慢

要运行基准测试

cd bench
rustup default nightly
cargo bench

链接

许可协议

SQueue 在 MIT 许可协议下授权。

依赖关系

~165KB