Crates.io | async-oneshot |
lib.rs | async-oneshot |
version | 0.5.0 |
source | src |
created_at | 2019-05-30 11:37:20.758098 |
updated_at | 2021-03-13 12:32:52.797812 |
description | A fast, small, full-featured, async-aware oneshot channel. |
homepage | https://github.com/irrustible/async-oneshot |
repository | https://github.com/irrustible/async-oneshot |
max_upload_size | |
id | 137879 |
size | 37,845 |
A fast, small, full-featured, async-aware oneshot channel.
Features:
Performance
section below.no_std
support (with alloc
for Arc
).#[test]
fn success_one_thread() {
let (s,r) = oneshot::<bool>();
assert_eq!((), s.send(true).unwrap());
assert_eq!(Ok(true), future::block_on(r));
}
async-oneshot comes with a benchmark suite which you can run with
cargo bench
.
All benches are single-threaded and take double digit nanoseconds on
my machine. async benches use futures_lite::future::block_on
as an
executor.
Here are benchmark numbers from my primary machine, a Ryzen 9 3900X running alpine linux 3.12 that I attempted to peg at maximum cpu:
create_destroy time: [51.596 ns 51.710 ns 51.835 ns]
send/success time: [13.080 ns 13.237 ns 13.388 ns]
send/closed time: [25.304 ns 25.565 ns 25.839 ns]
try_recv/success time: [26.136 ns 26.246 ns 26.335 ns]
try_recv/empty time: [10.764 ns 11.161 ns 11.539 ns]
try_recv/closed time: [27.048 ns 27.159 ns 27.248 ns]
async.recv/success time: [30.532 ns 30.774 ns 31.011 ns]
async.recv/closed time: [28.112 ns 28.208 ns 28.287 ns]
async.wait/success time: [56.449 ns 56.603 ns 56.737 ns]
async.wait/closed time: [34.014 ns 34.154 ns 34.294 ns]
In short, we are very fast. Close to optimal, I think.
The oneshot channel in futures
isn't very fast by comparison.
Tokio put up an excellent fight and made us work hard to improve. In general I'd say we're slightly faster overall, but it's incredibly tight.
This crate uses UnsafeCell and manually synchronises with atomic bitwise ops for performance. We believe it is correct, but we would welcome more eyes on it.
The benchmarks are synthetic and a bit of fun.
Breaking changes:
Sender.send()
only take a mut ref instead of move.Improvements:
Fixes:
debug_assert
s that caused crashes in
development in case of repeated waking. Thanks @nazar-pc!Improvements:
Breaking changes:
Sender.wait()
's function signature has changed to be a non-async fn
returning an impl Future
. This reduces binary size, runtime
and possibly memory usage too. Thanks @zserik!Fixes:
Improvements:
Improvements:
futures-micro
and improve the testsFixes:
Improvements:
Improvements:
Copyright (c) 2020 James Laver, async-oneshot contributors.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.