| #![feature(test)] |
| |
| extern crate test; |
| use crate::test::Bencher; |
| |
| use futures::channel::oneshot; |
| use futures::executor::block_on; |
| use futures::future; |
| use futures::stream::{FuturesUnordered, StreamExt}; |
| use futures::task::Poll; |
| use std::collections::VecDeque; |
| use std::thread; |
| |
| #[bench] |
| fn oneshots(b: &mut Bencher) { |
| const NUM: usize = 10_000; |
| |
| b.iter(|| { |
| let mut txs = VecDeque::with_capacity(NUM); |
| let mut rxs = FuturesUnordered::new(); |
| |
| for _ in 0..NUM { |
| let (tx, rx) = oneshot::channel(); |
| txs.push_back(tx); |
| rxs.push(rx); |
| } |
| |
| thread::spawn(move || { |
| while let Some(tx) = txs.pop_front() { |
| let _ = tx.send("hello"); |
| } |
| }); |
| |
| block_on(future::poll_fn(move |cx| { |
| loop { |
| if let Poll::Ready(None) = rxs.poll_next_unpin(cx) { |
| break; |
| } |
| } |
| Poll::Ready(()) |
| })) |
| }); |
| } |