122 lines
3.8 KiB
Rust
122 lines
3.8 KiB
Rust
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::<u128>();
|
|
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::<u128>();
|
|
c.bench_function("recv_deadline_now", |b| {
|
|
b.iter(|| receiver.recv_deadline(now).unwrap_err())
|
|
});
|
|
}
|
|
{
|
|
let (sender, receiver) = oneshot::channel::<u128>();
|
|
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::<u128>();
|
|
c.bench_function("recv_timeout_zero", |b| {
|
|
b.iter(|| receiver.recv_timeout(zero).unwrap_err())
|
|
});
|
|
}
|
|
{
|
|
let (sender, receiver) = oneshot::channel::<u128>();
|
|
mem::drop(sender);
|
|
c.bench_function("recv_timeout_zero_closed", |b| {
|
|
b.iter(|| receiver.recv_timeout(zero).unwrap_err())
|
|
});
|
|
}
|
|
}
|