Skip to content

Commit 2ca37df

Browse files
committed
Add benchmark for preparing SQE in place
Add benchmark for preparing SQE in place. Signed-off-by: Liu Jiang <[email protected]>
1 parent da473d8 commit 2ca37df

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

io-uring-bench/src/nop.rs

+35-1
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,39 @@ fn bench_prepare(c: &mut Criterion) {
6868
});
6969
});
7070
}
71-
criterion_group!(squeue, bench_normal, bench_prepare);
71+
72+
fn bench_prepare_sqe(c: &mut Criterion) {
73+
let mut io_uring = IoUring::new(16).unwrap();
74+
75+
c.bench_function("prepare_sqe", |b| {
76+
b.iter(|| {
77+
let mut queue = TaskQueue(128);
78+
79+
while queue.want() {
80+
{
81+
let mut sq = io_uring.submission();
82+
while queue.want() {
83+
unsafe {
84+
match sq.get_available_sqe(0) {
85+
Ok(sqe) => {
86+
let nop_sqe: &mut opcode::NopSqe = black_box(sqe.into());
87+
nop_sqe.prepare();
88+
sq.move_forward(1);
89+
queue.pop();
90+
}
91+
Err(_) => break,
92+
};
93+
}
94+
}
95+
}
96+
97+
io_uring.submit_and_wait(16).unwrap();
98+
99+
io_uring.completion().map(black_box).for_each(drop);
100+
}
101+
});
102+
});
103+
}
104+
105+
criterion_group!(squeue, bench_normal, bench_prepare, bench_prepare_sqe);
72106
criterion_main!(squeue);

io-uring-test/src/main.rs

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ fn main() -> anyhow::Result<()> {
3030
tests::queue::test_queue_split(&mut ring, &test)?;
3131
#[cfg(feature = "unstable")]
3232
tests::queue::test_nop_prepare(&mut ring, &test)?;
33+
#[cfg(feature = "unstable")]
34+
tests::queue::test_nop_prepare_sqe(&mut ring, &test)?;
3335

3436
#[cfg(feature = "unstable")]
3537
tests::queue::test_batch(&mut ring, &test)?;

io-uring-test/src/tests/queue.rs

+30
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,36 @@ pub fn test_nop_prepare(ring: &mut IoUring, test: &Test) -> anyhow::Result<()> {
5454
Ok(())
5555
}
5656

57+
#[cfg(feature = "unstable")]
58+
pub fn test_nop_prepare_sqe(ring: &mut IoUring, test: &Test) -> anyhow::Result<()> {
59+
require! {
60+
test;
61+
}
62+
63+
println!("test nop_prepare_sqe");
64+
65+
let opt = SqeCommonOptions::default().user_data(0x42);
66+
67+
unsafe {
68+
let mut queue = ring.submission();
69+
let sqe = queue.get_available_sqe(0).unwrap();
70+
let nop_sqe: &mut opcode::NopSqe = sqe.into();
71+
nop_sqe.prepare();
72+
opt.set(nop_sqe.get_mut_sqe());
73+
queue.move_forward(1);
74+
}
75+
76+
ring.submit_and_wait(1)?;
77+
78+
let cqes = ring.completion().collect::<Vec<_>>();
79+
80+
assert_eq!(cqes.len(), 1);
81+
assert_eq!(cqes[0].user_data(), 0x42);
82+
assert_eq!(cqes[0].result(), 0);
83+
84+
Ok(())
85+
}
86+
5787
#[cfg(feature = "unstable")]
5888
pub fn test_batch(ring: &mut IoUring, test: &Test) -> anyhow::Result<()> {
5989
use std::mem::MaybeUninit;

0 commit comments

Comments
 (0)