Skip to content

Commit 00e654c

Browse files
committed
test: add benchmarks
1 parent 394f6e4 commit 00e654c

File tree

2 files changed

+216
-3
lines changed

2 files changed

+216
-3
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ categories = ["data-structures"]
1414
license = "MIT"
1515

1616
[dev-dependencies]
17-
criterion = "0.4.0"
17+
criterion = { version = "0.4.0", features = ["html_reports"] }
1818
compiletest_rs = "0.10.0"
1919

2020
[features]

benches/bench.rs

Lines changed: 215 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
#![no_coverage]
1+
#![feature(coverage_attribute)]
2+
#![coverage(off)]
23
use criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion};
3-
use ringbuffer::{AllocRingBuffer, ConstGenericRingBuffer, RingBuffer};
4+
use ringbuffer::{AllocRingBuffer, ConstGenericRingBuffer, RingBuffer, SetLen};
45

56
fn benchmark_push<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F) {
67
b.iter(|| {
@@ -63,6 +64,89 @@ fn benchmark_various<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F)
6364
})
6465
}
6566

67+
fn benchmark_copy_to_slice_vs_extend<T: RingBuffer<i32>, F: Fn() -> T>(
68+
rb_size: usize,
69+
rb_type: &str,
70+
fn_name: &str,
71+
c: &mut Criterion,
72+
new: F,
73+
) {
74+
let mut group = c.benchmark_group(format!("{fn_name}({rb_type}, {rb_size})"));
75+
let mut output = vec![0; rb_size];
76+
group.bench_function(format!("CopyTo({rb_type}; {rb_size})"), |b| {
77+
let mut rb = new();
78+
rb.fill(9);
79+
// making sure the read/write pointers wrap around
80+
for _ in 0..rb_size / 2 {
81+
let _ = rb.dequeue();
82+
let _ = rb.enqueue(9);
83+
}
84+
b.iter(|| {
85+
rb.copy_to_slice(0, &mut output);
86+
assert_eq!(output[output.len() / 2], 9);
87+
assert_eq!(output.len(), rb_size);
88+
})
89+
});
90+
let mut output: Vec<i32> = Vec::with_capacity(rb_size);
91+
group.bench_function(format!("ExtendVec({rb_type}; {rb_size})"), |b| {
92+
let mut rb = new();
93+
rb.fill(9);
94+
// making sure the read/write pointers wrap around
95+
for _ in 0..rb_size / 2 {
96+
let _ = rb.dequeue();
97+
let _ = rb.enqueue(9);
98+
}
99+
b.iter(|| {
100+
unsafe { output.set_len(0) };
101+
output.extend(rb.iter());
102+
assert_eq!(output[output.len() / 2], 9);
103+
assert_eq!(output.len(), rb_size);
104+
})
105+
});
106+
group.finish();
107+
}
108+
109+
fn benchmark_copy_from_slice_vs_extend<T: RingBuffer<i32> + SetLen, F: Fn() -> T>(
110+
rb_size: usize,
111+
rb_type: &str,
112+
fn_name: &str,
113+
c: &mut Criterion,
114+
new: F,
115+
) {
116+
let mut group = c.benchmark_group(format!("{fn_name}({rb_type}, {rb_size})"));
117+
let input = vec![9; rb_size];
118+
group.bench_function(format!("CopyFrom({rb_type}; {rb_size})"), |b| {
119+
let mut rb = new();
120+
rb.fill(0);
121+
// making sure the read/write pointers wrap around
122+
for _ in 0..rb_size / 2 {
123+
let _ = rb.dequeue();
124+
let _ = rb.enqueue(0);
125+
}
126+
for _ in 0..rb_size / 2 {}
127+
b.iter(|| {
128+
rb.copy_from_slice(0, &input);
129+
assert_eq!(rb[rb.len() / 2], 9);
130+
assert_eq!(rb.len(), rb_size);
131+
})
132+
});
133+
group.bench_function(format!("ExtendRb({rb_type}; {rb_size})"), |b| {
134+
let mut rb = new();
135+
// making sure the read/write pointers wrap around
136+
for _ in 0..rb_size / 2 {
137+
let _ = rb.dequeue();
138+
let _ = rb.enqueue(0);
139+
}
140+
b.iter(|| {
141+
unsafe { rb.set_len(0) };
142+
rb.extend(input.iter().copied());
143+
assert_eq!(rb[rb.len() / 2], 9);
144+
assert_eq!(rb.len(), rb_size);
145+
})
146+
});
147+
group.finish();
148+
}
149+
66150
macro_rules! generate_benches {
67151
(called, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $($i:tt),*) => {
68152
$(
@@ -86,6 +170,22 @@ macro_rules! generate_benches {
86170
}));
87171
)*
88172
};
173+
174+
(compare, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $($i:tt),*) => {
175+
$(
176+
$bmfunc($i, stringify!($rb), stringify!($bmfunc), $c, || {
177+
$rb::<$ty>::$fn($i)
178+
});
179+
)*
180+
};
181+
182+
(compare_typed, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $($i:tt),*) => {
183+
$(
184+
$bmfunc($i, stringify!($rb), stringify!($bmfunc), $c, || {
185+
$rb::<$ty, $i>::$fn()
186+
});
187+
)*
188+
};
89189
}
90190

91191
fn criterion_benchmark(c: &mut Criterion) {
@@ -180,6 +280,119 @@ fn criterion_benchmark(c: &mut Criterion) {
180280
8192,
181281
8195
182282
];
283+
generate_benches![
284+
compare,
285+
c,
286+
AllocRingBuffer,
287+
i32,
288+
new,
289+
benchmark_copy_to_slice_vs_extend,
290+
16,
291+
1024,
292+
4096,
293+
8192,
294+
1_000_000,
295+
1_048_576
296+
];
297+
generate_benches![
298+
compare_typed,
299+
c,
300+
ConstGenericRingBuffer,
301+
i32,
302+
new,
303+
benchmark_copy_to_slice_vs_extend,
304+
16,
305+
1024,
306+
4096,
307+
8192,
308+
1_000_000,
309+
1_048_576
310+
];
311+
generate_benches![
312+
compare,
313+
c,
314+
AllocRingBuffer,
315+
i32,
316+
new,
317+
benchmark_copy_from_slice_vs_extend,
318+
16,
319+
1024,
320+
4096,
321+
8192,
322+
1_000_000,
323+
1_048_576
324+
];
325+
generate_benches![
326+
compare_typed,
327+
c,
328+
ConstGenericRingBuffer,
329+
i32,
330+
new,
331+
benchmark_copy_from_slice_vs_extend,
332+
16,
333+
1024,
334+
4096,
335+
8192,
336+
1_000_000,
337+
1_048_576
338+
];
339+
340+
generate_benches![
341+
compare,
342+
c,
343+
AllocRingBuffer,
344+
i32,
345+
new,
346+
benchmark_copy_to_slice_vs_extend,
347+
16,
348+
1024,
349+
4096,
350+
8192,
351+
1_000_000,
352+
1_048_576
353+
];
354+
generate_benches![
355+
compare_typed,
356+
c,
357+
ConstGenericRingBuffer,
358+
i32,
359+
new,
360+
benchmark_copy_to_slice_vs_extend,
361+
16,
362+
1024,
363+
4096,
364+
8192,
365+
1_000_000,
366+
1_048_576
367+
];
368+
generate_benches![
369+
compare,
370+
c,
371+
AllocRingBuffer,
372+
i32,
373+
new,
374+
benchmark_copy_from_slice_vs_extend,
375+
16,
376+
1024,
377+
4096,
378+
8192,
379+
1_000_000,
380+
1_048_576
381+
];
382+
generate_benches![
383+
compare_typed,
384+
c,
385+
ConstGenericRingBuffer,
386+
i32,
387+
new,
388+
benchmark_copy_from_slice_vs_extend,
389+
16,
390+
1024,
391+
4096,
392+
8192,
393+
1_000_000,
394+
1_048_576
395+
];
183396
}
184397

185398
criterion_group!(benches, criterion_benchmark);

0 commit comments

Comments
 (0)