2018-09-26 17:52:35 +02:00
|
|
|
#![feature(test)]
|
2019-05-14 10:27:36 -07:00
|
|
|
#![deny(warnings, rust_2018_idioms)]
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2019-06-24 12:34:30 -07:00
|
|
|
/*
|
2018-09-26 17:52:35 +02:00
|
|
|
extern crate test;
|
|
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
const NUM_YIELD: usize = 500;
|
|
|
|
|
const TASKS_PER_CPU: usize = 100;
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
mod threadpool {
|
|
|
|
|
use super::*;
|
|
|
|
|
use std::sync::mpsc;
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
use futures::{future, Async};
|
2019-02-21 11:56:15 -08:00
|
|
|
use test::Bencher;
|
2018-10-03 23:09:20 +02:00
|
|
|
use tokio::runtime::Runtime;
|
2019-02-21 11:56:15 -08:00
|
|
|
use tokio_reactor::Registration;
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
#[bench]
|
|
|
|
|
fn notify_many(b: &mut Bencher) {
|
|
|
|
|
let mut rt = Runtime::new().unwrap();
|
|
|
|
|
let tasks = TASKS_PER_CPU * num_cpus::get();
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
b.iter(|| {
|
|
|
|
|
let (tx, rx) = mpsc::channel();
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
rt.block_on::<_, (), ()>(future::lazy(move || {
|
|
|
|
|
for _ in 0..tasks {
|
|
|
|
|
let tx = tx.clone();
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
tokio::spawn(future::lazy(move || {
|
|
|
|
|
let (r, s) = mio::Registration::new2();
|
|
|
|
|
let registration = Registration::new();
|
|
|
|
|
registration.register(&r).unwrap();
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
let mut rem = NUM_YIELD;
|
|
|
|
|
let mut r = Some(r);
|
|
|
|
|
let tx = tx.clone();
|
2018-09-26 17:52:35 +02:00
|
|
|
|
2019-02-21 11:56:15 -08:00
|
|
|
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(()));
|
2018-10-03 23:09:20 +02:00
|
|
|
}
|
2019-02-21 11:56:15 -08:00
|
|
|
} else {
|
|
|
|
|
s.set_readiness(mio::Ready::readable()).unwrap();
|
|
|
|
|
return Ok(Async::NotReady);
|
2018-10-03 23:09:20 +02:00
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(())
|
2019-02-21 11:56:15 -08:00
|
|
|
}))
|
|
|
|
|
.unwrap();
|
2018-10-03 23:09:20 +02:00
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
2019-02-21 11:56:15 -08:00
|
|
|
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(()));
|
2018-10-03 23:09:20 +02:00
|
|
|
}
|
2019-02-21 11:56:15 -08:00
|
|
|
} else {
|
|
|
|
|
s.set_readiness(mio::Ready::readable()).unwrap();
|
|
|
|
|
return Ok(Async::NotReady);
|
2018-10-03 23:09:20 +02:00
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}));
|
2018-09-26 17:52:35 +02:00
|
|
|
}
|
|
|
|
|
|
2018-10-03 23:09:20 +02:00
|
|
|
Ok(())
|
2019-02-21 11:56:15 -08:00
|
|
|
}))
|
|
|
|
|
.unwrap();
|
2018-10-03 23:09:20 +02:00
|
|
|
|
|
|
|
|
for _ in 0..tasks {
|
|
|
|
|
rx.recv().unwrap();
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2018-09-26 17:52:35 +02:00
|
|
|
}
|
2019-06-24 12:34:30 -07:00
|
|
|
*/
|