Performance with many senders on multi-threaded runtime
Hi,
I wrote a benchmark to compare two scenarios for collecting messages from many tokio tasks:
a) cloning the sender of a single channel
b) merging the receivers of many channels (with [`futures_buffered::FuturesUnordered`](https://docs.rs/futures-buffered/latest/futures_buffered/struct.FuturesUnordered.html))
This brought up a for me surprising result: `flume` performance seems to degrade a lot when a channel sender is cloned into many tasks on a multi-threaded tokio runtime. `tokio::sync::mpsc` seems to cope better with this setup.
I published the benchmark [in this gist](https://gist.github.com/Frando/9a7a6f07088a0ca1a4ea867082362e86). Here's the numbers from my machine (release mode, Intel 8250u quad core laptop):
```
running channel benchmark with 1048576 messages and capacity 1024
# tasks: 2, messages per task: 524288, capacity per task: 512
## multi_thread runtime
tokio (merged receivers) 284 ms 271 ns/message
tokio (cloned sender) 262 ms 250 ns/message
flume (merged receivers) 268 ms 256 ns/message
flume (cloned sender) 220 ms 210 ns/message
## current_thread runtime
tokio (merged receivers) 374 ms 357 ns/message
tokio (cloned sender) 211 ms 201 ns/message
flume (merged receivers) 137 ms 131 ns/message
flume (cloned sender) 81 ms 78 ns/message
# tasks: 16, messages per task: 65536, capacity per task: 64
## multi_thread runtime
tokio (merged receivers) 352 ms 336 ns/message
tokio (cloned sender) 287 ms 274 ns/message
flume (merged receivers) 383 ms 366 ns/message
flume (cloned sender) 560 ms 534 ns/message
## current_thread runtime
tokio (merged receivers) 257 ms 245 ns/message
tokio (cloned sender) 174 ms 166 ns/message
flume (merged receivers) 131 ms 125 ns/message
flume (cloned sender) 77 ms 73 ns/message
# tasks: 64, messages per task: 16384, capacity per task: 16
## multi_thread runtime
tokio (merged receivers) 430 ms 410 ns/message
tokio (cloned sender) 834 ms 795 ns/message
flume (merged receivers) 411 ms 392 ns/message
flume (cloned sender) 2919 ms 2784 ns/message
## current_thread runtime
tokio (merged receivers) 359 ms 342 ns/message
tokio (cloned sender) 231 ms 220 ns/message
flume (merged receivers) 154 ms 146 ns/message
flume (cloned sender) 91 ms 87 ns/message
# tasks: 512, messages per task: 2048, capacity per task: 2
## multi_thread runtime
tokio (merged receivers) 415 ms 396 ns/message
tokio (cloned sender) 836 ms 798 ns/message
flume (merged receivers) 387 ms 369 ns/message
flume (cloned sender) 9407 ms 8971 ns/message
## current_thread runtime
tokio (merged receivers) 538 ms 513 ns/message
tokio (cloned sender) 397 ms 379 ns/message
flume (merged receivers) 233 ms 222 ns/message
flume (cloned sender) 354 ms 338 ns/message
```
0 条评论