1 个不稳定版本
0.1.0 | 2023 年 12 月 17 日 |
---|
#745 in 并发
16KB
239 行
高吞吐量和简单的带缓冲的 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