1 #![feature(test)]
2 
3 extern crate test;
4 use crate::test::Bencher;
5 
6 use futures::channel::oneshot;
7 use futures::executor::block_on;
8 use futures::future;
9 use futures::stream::{FuturesUnordered, StreamExt};
10 use futures::task::Poll;
11 use std::collections::VecDeque;
12 use std::thread;
13 
14 #[bench]
oneshots(b: &mut Bencher)15 fn oneshots(b: &mut Bencher) {
16     const NUM: usize = 10_000;
17 
18     b.iter(|| {
19         let mut txs = VecDeque::with_capacity(NUM);
20         let mut rxs = FuturesUnordered::new();
21 
22         for _ in 0..NUM {
23             let (tx, rx) = oneshot::channel();
24             txs.push_back(tx);
25             rxs.push(rx);
26         }
27 
28         thread::spawn(move || {
29             while let Some(tx) = txs.pop_front() {
30                 let _ = tx.send("hello");
31             }
32         });
33 
34         block_on(future::poll_fn(move |cx| {
35             loop {
36                 if let Poll::Ready(None) = rxs.poll_next_unpin(cx) {
37                     break;
38                 }
39             }
40             Poll::Ready(())
41         }))
42     });
43 }
44