68 lines
1.5 KiB
Rust
68 lines
1.5 KiB
Rust
#![feature(test)]
|
|
#![cfg(feature = "bilock")]
|
|
|
|
extern crate test;
|
|
|
|
use futures::task::Poll;
|
|
use futures_test::task::noop_context;
|
|
use futures_util::lock::BiLock;
|
|
|
|
use crate::test::Bencher;
|
|
|
|
#[bench]
|
|
fn contended(b: &mut Bencher) {
|
|
let mut context = noop_context();
|
|
|
|
b.iter(|| {
|
|
let (x, y) = BiLock::new(1);
|
|
|
|
for _ in 0..1000 {
|
|
let x_guard = match x.poll_lock(&mut context) {
|
|
Poll::Ready(guard) => guard,
|
|
_ => panic!(),
|
|
};
|
|
|
|
// Try poll second lock while first lock still holds the lock
|
|
match y.poll_lock(&mut context) {
|
|
Poll::Pending => (),
|
|
_ => panic!(),
|
|
};
|
|
|
|
drop(x_guard);
|
|
|
|
let y_guard = match y.poll_lock(&mut context) {
|
|
Poll::Ready(guard) => guard,
|
|
_ => panic!(),
|
|
};
|
|
|
|
drop(y_guard);
|
|
}
|
|
(x, y)
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn lock_unlock(b: &mut Bencher) {
|
|
let mut context = noop_context();
|
|
|
|
b.iter(|| {
|
|
let (x, y) = BiLock::new(1);
|
|
|
|
for _ in 0..1000 {
|
|
let x_guard = match x.poll_lock(&mut context) {
|
|
Poll::Ready(guard) => guard,
|
|
_ => panic!(),
|
|
};
|
|
|
|
drop(x_guard);
|
|
|
|
let y_guard = match y.poll_lock(&mut context) {
|
|
Poll::Ready(guard) => guard,
|
|
_ => panic!(),
|
|
};
|
|
|
|
drop(y_guard);
|
|
}
|
|
(x, y)
|
|
})
|
|
}
|