| #![feature(test)] | 
 | #![deny(warnings)] | 
 |  | 
 | extern crate futures; | 
 | extern crate mio; | 
 | extern crate num_cpus; | 
 | extern crate test; | 
 | extern crate tokio; | 
 | extern crate tokio_io_pool; | 
 | extern crate tokio_reactor; | 
 |  | 
 | const NUM_YIELD: usize = 500; | 
 | const TASKS_PER_CPU: usize = 100; | 
 |  | 
 | mod threadpool { | 
 |     use super::*; | 
 |     use std::sync::mpsc; | 
 |  | 
 |     use futures::{future, Async}; | 
 |     use test::Bencher; | 
 |     use tokio::runtime::Runtime; | 
 |     use tokio_reactor::Registration; | 
 |  | 
 |     #[bench] | 
 |     fn notify_many(b: &mut Bencher) { | 
 |         let mut rt = Runtime::new().unwrap(); | 
 |         let tasks = TASKS_PER_CPU * num_cpus::get(); | 
 |  | 
 |         b.iter(|| { | 
 |             let (tx, rx) = mpsc::channel(); | 
 |  | 
 |             rt.block_on::<_, (), ()>(future::lazy(move || { | 
 |                 for _ in 0..tasks { | 
 |                     let tx = tx.clone(); | 
 |  | 
 |                     tokio::spawn(future::lazy(move || { | 
 |                         let (r, s) = mio::Registration::new2(); | 
 |                         let registration = Registration::new(); | 
 |                         registration.register(&r).unwrap(); | 
 |  | 
 |                         let mut rem = NUM_YIELD; | 
 |                         let mut r = Some(r); | 
 |                         let tx = tx.clone(); | 
 |  | 
 |                         tokio::spawn(future::poll_fn(move || loop { | 
 |                             let is_ready = registration.poll_read_ready().unwrap().is_ready(); | 
 |  | 
 |                             if is_ready { | 
 |                                 rem -= 1; | 
 |  | 
 |                                 if rem == 0 { | 
 |                                     r.take().unwrap(); | 
 |                                     tx.send(()).unwrap(); | 
 |                                     return Ok(Async::Ready(())); | 
 |                                 } | 
 |                             } else { | 
 |                                 s.set_readiness(mio::Ready::readable()).unwrap(); | 
 |                                 return Ok(Async::NotReady); | 
 |                             } | 
 |                         })); | 
 |  | 
 |                         Ok(()) | 
 |                     })); | 
 |                 } | 
 |  | 
 |                 Ok(()) | 
 |             })) | 
 |             .unwrap(); | 
 |  | 
 |             for _ in 0..tasks { | 
 |                 rx.recv().unwrap(); | 
 |             } | 
 |         }) | 
 |     } | 
 | } | 
 |  | 
 | mod io_pool { | 
 |     use super::*; | 
 |     use std::sync::mpsc; | 
 |  | 
 |     use futures::{future, Async}; | 
 |     use test::Bencher; | 
 |     use tokio_io_pool::Runtime; | 
 |     use tokio_reactor::Registration; | 
 |  | 
 |     #[bench] | 
 |     fn notify_many(b: &mut Bencher) { | 
 |         let mut rt = Runtime::new(); | 
 |         let tasks = TASKS_PER_CPU * num_cpus::get(); | 
 |  | 
 |         b.iter(|| { | 
 |             let (tx, rx) = mpsc::channel(); | 
 |  | 
 |             rt.block_on::<_, (), ()>(future::lazy(move || { | 
 |                 for _ in 0..tasks { | 
 |                     let tx = tx.clone(); | 
 |  | 
 |                     tokio::spawn(future::lazy(move || { | 
 |                         let (r, s) = mio::Registration::new2(); | 
 |                         let registration = Registration::new(); | 
 |                         registration.register(&r).unwrap(); | 
 |  | 
 |                         let mut rem = NUM_YIELD; | 
 |                         let mut r = Some(r); | 
 |                         let tx = tx.clone(); | 
 |  | 
 |                         tokio::spawn(future::poll_fn(move || loop { | 
 |                             let is_ready = registration.poll_read_ready().unwrap().is_ready(); | 
 |  | 
 |                             if is_ready { | 
 |                                 rem -= 1; | 
 |  | 
 |                                 if rem == 0 { | 
 |                                     r.take().unwrap(); | 
 |                                     tx.send(()).unwrap(); | 
 |                                     return Ok(Async::Ready(())); | 
 |                                 } | 
 |                             } else { | 
 |                                 s.set_readiness(mio::Ready::readable()).unwrap(); | 
 |                                 return Ok(Async::NotReady); | 
 |                             } | 
 |                         })); | 
 |  | 
 |                         Ok(()) | 
 |                     })); | 
 |                 } | 
 |  | 
 |                 Ok(()) | 
 |             })) | 
 |             .unwrap(); | 
 |  | 
 |             for _ in 0..tasks { | 
 |                 rx.recv().unwrap(); | 
 |             } | 
 |         }) | 
 |     } | 
 | } |