ITADN

Performance with many senders on multi-threaded runtime

#152OpenFrando 创建于 2024-07-12
F
Frandocommented
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 条评论