#mpsc #channel #thread #fifo

bufchan

一个简单的带缓冲的 MPSC 通道

1 个不稳定版本

0.1.0 2023 年 12 月 17 日

#745 in 并发

MIT 许可协议

16KB
239

GitHub Repo stars Crates.io docs.rs GitHub Workflow Status (with event)

高吞吐量和简单的带缓冲的 MPSC 通道实现。

bufchan 是一个优先考虑 发送端吞吐量 而不是 接收端延迟 的 MPSC 通道实现。它使用本地缓冲区来避免访问共享状态,仅在达到某个阈值时批量发送项目。此实现优先考虑发送端的 吞吐量,例如一个需要保持计算线程尽可能不被阻塞的重型计算任务。

bufchan 也非常 简单。通道实现大约有 100 行代码,并且没有使用任何 unsafe。我鼓励用户阅读源代码,它注释丰富,是理解通道的绝佳方式!

基准测试

构建了一个用于测量吞吐量的基准测试设置,其中一定数量的任务执行一些非平凡和非常数的操作。任务被并行化,每个结果都使用各种通道实现选项发送。整数基准测试发送 32 位整数,其他两个基准测试发送各种大小的数组。

bench                 fastest       │ slowest       │ median        │ mean 
├─ int                              │               │               │       
│  ├─ bufchan         36.43 ms      │ 44.15 ms      │ 36.88 ms      │ 37.28 ms
│  ├─ bufchan_buf0    36.5 ms       │ 140.1 ms      │ 38.49 ms      │ 39.6 ms
│  ├─ crossbeam       37.66 ms      │ 42.02 ms      │ 39.14 ms      │ 39.26 ms
│  ├─ flume           122.9 ms      │ 137.9 ms      │ 125.5 ms      │ 127.5 ms
│  ├─ kanal           38.55 ms      │ 49.36 ms      │ 41.54 ms      │ 41.75 ms
│  ╰─ std_mpsc        37.21 ms      │ 44.13 ms      │ 40.43 ms      │ 40.19 ms
├─ non_copy_24bytes                 │               │               │        
│  ├─ bufchan         37.08 ms      │ 137.9 ms      │ 37.96 ms      │ 39.15 ms
│  ├─ bufchan_buf0    36.89 ms      │ 141.1 ms      │ 39.19 ms      │ 41.45 ms
│  ├─ crossbeam       125.9 ms      │ 138.1 ms      │ 128.5 ms      │ 130.5 ms
│  ├─ flume           124.1 ms      │ 144.5 ms      │ 128 ms        │ 130.5 ms
│  ├─ kanal           40.42 ms      │ 46.93 ms      │ 42.78 ms      │ 42.93 ms
│  ╰─ std_mpsc        123.6 ms      │ 144.7 ms      │ 127.7 ms      │ 130.2 ms
╰─ non_copy_256bytes                │               │               │         
   ├─ bufchan         37.4 ms       │ 48.61 ms      │ 38.83 ms      │ 39.14 ms
   ├─ bufchan_buf0    37.84 ms      │ 46.2 ms       │ 40.85 ms      │ 40.78 ms
   ├─ crossbeam       125.7 ms      │ 139.8 ms      │ 128.5 ms      │ 130.5 ms
   ├─ flume           124.6 ms      │ 140.2 ms      │ 126.9 ms      │ 128.8 ms
   ├─ kanal           45.76 ms      │ 58.58 ms      │ 48.37 ms      │ 48.61 ms
   ╰─ std_mpsc        123.7 ms      │ 143.6 ms      │ 126.8 ms      │ 128.7 ms

注意事项

必须强调这是一个 带缓冲的 通道。单个 send 调用很可能 不会 触发相应的 recv 唤醒。所有消息都保证能够到达 Receiver,但单个消息的 延迟 并不一致。对于生产速度慢的长期存在的 Sender,降低缓冲区大小或手动调用 flush 可以确保消息到达接收器。

依赖关系

~0.4–5.5MB
~11K SLoC