Skip to content

Commit

Permalink
Add ThreadNotify benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
carllerche committed Oct 1, 2017
1 parent d832074 commit 60d9ce1
Showing 1 changed file with 114 additions and 0 deletions.
114 changes: 114 additions & 0 deletions benches/thread_notify.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#![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::<Task>(10_000);

struct Yield {
rem: usize,
tx: mpsc::SyncSender<Task>,
}

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();
});
}

0 comments on commit 60d9ce1

Please sign in to comment.