#![feature(test)] extern crate futures; extern crate test; use futures::{Future, Poll, Async}; use futures::task::{self, Task}; use test::Bencher; #[bench] fn thread_yield_single_thread_one_wait(b: &mut Bencher) { const NUM: usize = 10_000; struct Yield { rem: usize, } impl Future for Yield { type Item = (); type Error = (); fn poll(&mut self) -> Poll<(), ()> { if self.rem == 0 { Ok(Async::Ready(())) } else { self.rem -= 1; task::current().notify(); Ok(Async::NotReady) } } } b.iter(|| { let y = Yield { rem: NUM }; y.wait().unwrap(); }); } #[bench] fn thread_yield_single_thread_many_wait(b: &mut Bencher) { const NUM: usize = 10_000; struct Yield { rem: usize, } impl Future for Yield { type Item = (); type Error = (); fn poll(&mut self) -> Poll<(), ()> { if self.rem == 0 { Ok(Async::Ready(())) } else { self.rem -= 1; task::current().notify(); Ok(Async::NotReady) } } } b.iter(|| { for _ in 0..NUM { let y = Yield { rem: 1 }; y.wait().unwrap(); } }); } #[bench] fn thread_yield_multi_thread(b: &mut Bencher) { use std::sync::mpsc; use std::thread; const NUM: usize = 1_000; let (tx, rx) = mpsc::sync_channel::(10_000); struct Yield { rem: usize, tx: mpsc::SyncSender, } impl Future for Yield { type Item = (); type Error = (); fn poll(&mut self) -> Poll<(), ()> { if self.rem == 0 { Ok(Async::Ready(())) } else { self.rem -= 1; self.tx.send(task::current()).unwrap(); Ok(Async::NotReady) } } } thread::spawn(move || { while let Ok(task) = rx.recv() { task.notify(); } }); b.iter(move || { let y = Yield { rem: NUM, tx: tx.clone(), }; y.wait().unwrap(); }); }