async-task 1.1.1

Task abstraction for building executors
Documentation
#![feature(test)]

extern crate test;

use futures::channel::oneshot;
use futures::executor;
use futures::future::TryFutureExt;
use test::Bencher;

#[bench]
fn task_create(b: &mut Bencher) {
    b.iter(|| {
        async_task::spawn(async {}, drop, ());
    });
}

#[bench]
fn task_run(b: &mut Bencher) {
    b.iter(|| {
        let (task, handle) = async_task::spawn(async {}, drop, ());
        task.run();
        executor::block_on(handle).unwrap();
    });
}

#[bench]
fn oneshot_create(b: &mut Bencher) {
    b.iter(|| {
        let (tx, _rx) = oneshot::channel::<()>();
        let _task = Box::new(async move { tx.send(()).map_err(|_| ()) });
    });
}

#[bench]
fn oneshot_run(b: &mut Bencher) {
    b.iter(|| {
        let (tx, rx) = oneshot::channel::<()>();
        let task = Box::new(async move { tx.send(()).map_err(|_| ()) });

        let future = task.and_then(|_| rx.map_err(|_| ()));
        executor::block_on(future).unwrap();
    });
}