Compare commits

...

4 Commits

Author SHA1 Message Date
John Nunley 9969a29ccd
v1.1.2
Signed-off-by: John Nunley <dev@notgull.net>
2023-09-25 10:44:52 -07:00
Taiki Endo eba124f52a Update actions/checkout action to v4 2023-09-10 18:22:00 +09:00
John Nunley 58880f9496
Add smol-rs logo (#16) 2023-07-17 14:34:20 +09:00
John Nunley 5de748aa9d
bench: Add benchmarks 2023-07-10 12:29:11 -07:00
6 changed files with 122 additions and 8 deletions

View File

@ -34,7 +34,7 @@ jobs:
os: [ubuntu-latest]
rust: [nightly, beta, stable]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install Rust
run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }}
- run: rustup target add thumbv7m-none-eabi
@ -53,7 +53,7 @@ jobs:
# Rust version in Cargo.toml.
rust: ['1.36']
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install Rust
run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }}
- run: cargo build
@ -61,7 +61,7 @@ jobs:
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install Rust
run: rustup update stable
- run: cargo clippy --all-features --all-targets
@ -69,7 +69,7 @@ jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install Rust
run: rustup update stable
- run: cargo fmt --all --check
@ -77,7 +77,7 @@ jobs:
miri:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install Rust
run: rustup toolchain install nightly --component miri && rustup default nightly
- run: cargo miri test
@ -92,7 +92,7 @@ jobs:
issues: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
# https://github.com/rustsec/audit-check/issues/2
- uses: rustsec/audit-check@master
with:

View File

@ -13,7 +13,7 @@ jobs:
if: github.repository_owner == 'smol-rs'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: taiki-e/create-gh-release-action@v1
with:
changelog: CHANGELOG.md

View File

@ -1,3 +1,7 @@
# Version 1.1.2
- Add `smol-rs` logo to docs. (#16)
# Version 1.1.1
- Use `will_wake()` to avoid unnecessary cloning. (#12)

View File

@ -3,7 +3,7 @@ name = "atomic-waker"
# When publishing a new version:
# - Update CHANGELOG.md
# - Create "v1.x.y" git tag
version = "1.1.1"
version = "1.1.2"
authors = [
"Stjepan Glavina <stjepang@gmail.com>",
"Contributors to futures-rs",
@ -22,4 +22,10 @@ exclude = ["/.*"]
portable-atomic = { version = "1", optional = true, default-features = false }
[dev-dependencies]
criterion = { version = "0.4.0", default-features = false, features = ["cargo_bench_support"] }
futures = "0.3.5"
rayon = "1.7.0"
[[bench]]
name = "waker"
harness = false

98
benches/waker.rs Normal file
View File

@ -0,0 +1,98 @@
use atomic_waker::AtomicWaker;
use criterion::{black_box, criterion_group, criterion_main, BenchmarkGroup, Criterion};
use std::sync::Arc;
use std::task::{Wake, Waker};
enum Contention {
Low,
High,
}
impl Contention {
fn bench<M>(
self,
group: &mut BenchmarkGroup<'_, M>,
f: impl Fn(&AtomicWaker) + Send + Sync + Clone,
) where
M: criterion::measurement::Measurement,
{
let waker = AtomicWaker::new();
match self {
Self::Low => {
// Run the benchmark with low contention.
group.bench_function("low contention", move |b| {
b.iter(|| {
for _ in 0..500 {
f(&waker);
}
})
});
}
Self::High => {
// Run the benchmark with high contention.
group.bench_function("high contention", move |b| {
b.iter(|| {
use rayon::prelude::*;
(0..100_000).into_par_iter().for_each(|_| f(&waker));
})
});
}
}
}
}
fn run_lo_hi(c: &mut Criterion, name: &str, f: impl Fn(&AtomicWaker) + Send + Sync + Clone) {
let mut group = c.benchmark_group(name);
Contention::Low.bench(&mut group, f.clone());
Contention::High.bench(&mut group, f);
group.finish();
}
fn store_and_wake(c: &mut Criterion) {
run_lo_hi(c, "store and wake", |waker| {
let noop_waker = noop_waker();
waker.register(&noop_waker);
waker.wake();
});
run_lo_hi(c, "store and take", |waker| {
let noop_waker = noop_waker();
waker.register(&noop_waker);
black_box(waker.take());
});
}
fn wake_without_store(c: &mut Criterion) {
run_lo_hi(c, "wake without store", |waker| {
waker.wake();
});
run_lo_hi(c, "take without store", |waker| {
black_box(waker.take());
});
}
criterion_group!(benches, store_and_wake, wake_without_store);
criterion_main!(benches);
fn noop_waker() -> Waker {
struct Noop;
impl Wake for Noop {
fn wake(self: Arc<Self>) {
// Do nothing
}
fn wake_by_ref(self: &Arc<Self>) {
// Do nothing
}
}
Waker::from(Arc::new(Noop))
}

View File

@ -11,6 +11,12 @@
//! [`README`]: https://github.com/taiki-e/portable-atomic/blob/main/README.md#optional-cfg
#![no_std]
#![doc(
html_favicon_url = "https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png"
)]
#![doc(
html_logo_url = "https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png"
)]
use core::cell::UnsafeCell;
use core::fmt;