use criterion::{black_box, criterion_group, criterion_main, Criterion}; use std::mem; use std::time::{Duration, Instant}; criterion_group!(benches, bench); criterion_main!(benches); macro_rules! bench_send_and_recv { ($c:expr, $($type:ty => $value:expr);+) => { // Sanity check that all $values are of $type. $(let _: $type = $value;)* { let mut group = $c.benchmark_group("create_channel"); $(group.bench_function(stringify!($type), |b| { b.iter(oneshot::channel::<$type>) });)* group.finish(); } { let mut group = $c.benchmark_group("create_and_send"); $(group.bench_function(stringify!($type), |b| { b.iter(|| { let (sender, _receiver) = oneshot::channel(); sender.send(black_box($value)).unwrap() }); });)* group.finish(); } { let mut group = $c.benchmark_group("create_and_send_on_closed"); $(group.bench_function(stringify!($type), |b| { b.iter(|| { let (sender, _) = oneshot::channel(); sender.send(black_box($value)).unwrap_err() }); });)* group.finish(); } { let mut group = $c.benchmark_group("create_send_and_recv"); $(group.bench_function(stringify!($type), |b| { b.iter(|| { let (sender, receiver) = oneshot::channel(); sender.send(black_box($value)).unwrap(); receiver.recv().unwrap() }); });)* group.finish(); } { let mut group = $c.benchmark_group("create_send_and_recv_ref"); $(group.bench_function(stringify!($type), |b| { b.iter(|| { let (sender, receiver) = oneshot::channel(); sender.send(black_box($value)).unwrap(); receiver.recv_ref().unwrap() }); });)* group.finish(); } }; } fn bench(c: &mut Criterion) { bench_send_and_recv!(c, () => (); u8 => 7u8; usize => 9876usize; u128 => 1234567u128; [u8; 64] => [0b10101010u8; 64]; [u8; 4096] => [0b10101010u8; 4096] ); bench_try_recv(c); bench_recv_deadline_now(c); bench_recv_timeout_zero(c); } fn bench_try_recv(c: &mut Criterion) { let (sender, receiver) = oneshot::channel::(); c.bench_function("try_recv_empty", |b| { b.iter(|| receiver.try_recv().unwrap_err()) }); mem::drop(sender); c.bench_function("try_recv_empty_closed", |b| { b.iter(|| receiver.try_recv().unwrap_err()) }); } fn bench_recv_deadline_now(c: &mut Criterion) { let now = Instant::now(); { let (_sender, receiver) = oneshot::channel::(); c.bench_function("recv_deadline_now", |b| { b.iter(|| receiver.recv_deadline(now).unwrap_err()) }); } { let (sender, receiver) = oneshot::channel::(); mem::drop(sender); c.bench_function("recv_deadline_now_closed", |b| { b.iter(|| receiver.recv_deadline(now).unwrap_err()) }); } } fn bench_recv_timeout_zero(c: &mut Criterion) { let zero = Duration::from_nanos(0); { let (_sender, receiver) = oneshot::channel::(); c.bench_function("recv_timeout_zero", |b| { b.iter(|| receiver.recv_timeout(zero).unwrap_err()) }); } { let (sender, receiver) = oneshot::channel::(); mem::drop(sender); c.bench_function("recv_timeout_zero_closed", |b| { b.iter(|| receiver.recv_timeout(zero).unwrap_err()) }); } }