Add more benchmarks of Vec::dedup
They are for more specific cases than old benches. Also, better usage of blackbox
This commit is contained in:
parent
1db4b12494
commit
0c6901a487
1 changed files with 109 additions and 22 deletions
|
@ -658,13 +658,16 @@ fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {
|
|||
buf.sort();
|
||||
}
|
||||
|
||||
fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) {
|
||||
// Measures performance of slice dedup impl.
|
||||
// "Old" implementation of Vec::dedup
|
||||
fn bench_dedup_slice_truncate(b: &mut Bencher, sz: usize) {
|
||||
let mut template = vec![0u32; sz];
|
||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||
random_sorted_fill(0x43, &mut template);
|
||||
|
||||
let mut vec = template.clone();
|
||||
b.iter(|| {
|
||||
let vec = black_box(&mut vec);
|
||||
let len = {
|
||||
let (dedup, _) = vec.partition_dedup();
|
||||
dedup.len()
|
||||
|
@ -672,59 +675,143 @@ fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) {
|
|||
vec.truncate(len);
|
||||
|
||||
black_box(vec.first());
|
||||
let vec = black_box(vec);
|
||||
vec.clear();
|
||||
vec.extend_from_slice(&template);
|
||||
});
|
||||
}
|
||||
|
||||
fn bench_vec_dedup_new(b: &mut Bencher, sz: usize) {
|
||||
// Measures performance of Vec::dedup on random data.
|
||||
fn bench_vec_dedup_random(b: &mut Bencher, sz: usize) {
|
||||
let mut template = vec![0u32; sz];
|
||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||
random_sorted_fill(0x43, &mut template);
|
||||
|
||||
let mut vec = template.clone();
|
||||
b.iter(|| {
|
||||
let vec = black_box(&mut vec);
|
||||
vec.dedup();
|
||||
black_box(vec.first());
|
||||
let vec = black_box(vec);
|
||||
vec.clear();
|
||||
vec.extend_from_slice(&template);
|
||||
});
|
||||
}
|
||||
|
||||
// Measures performance of Vec::dedup when there is no items removed
|
||||
fn bench_vec_dedup_none(b: &mut Bencher, sz: usize) {
|
||||
let mut template = vec![0u32; sz];
|
||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||
template.chunks_exact_mut(2).for_each(|w| {
|
||||
w[0] = black_box(0);
|
||||
w[1] = black_box(5);
|
||||
});
|
||||
|
||||
let mut vec = template.clone();
|
||||
b.iter(|| {
|
||||
let vec = black_box(&mut vec);
|
||||
vec.dedup();
|
||||
black_box(vec.first());
|
||||
// Unlike other benches of `dedup`
|
||||
// this doesn't reinitialize vec
|
||||
// because we measure how effecient dedup is
|
||||
// when no memory written
|
||||
});
|
||||
}
|
||||
|
||||
// Measures performance of Vec::dedup when there is all items removed
|
||||
fn bench_vec_dedup_all(b: &mut Bencher, sz: usize) {
|
||||
let mut template = vec![0u32; sz];
|
||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||
template.iter_mut().for_each(|w| {
|
||||
*w = black_box(0);
|
||||
});
|
||||
|
||||
let mut vec = template.clone();
|
||||
b.iter(|| {
|
||||
let vec = black_box(&mut vec);
|
||||
vec.dedup();
|
||||
black_box(vec.first());
|
||||
let vec = black_box(vec);
|
||||
vec.clear();
|
||||
vec.extend_from_slice(&template);
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_old_100(b: &mut Bencher) {
|
||||
bench_vec_dedup_old(b, 100);
|
||||
fn bench_dedup_slice_truncate_100(b: &mut Bencher) {
|
||||
bench_dedup_slice_truncate(b, 100);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_new_100(b: &mut Bencher) {
|
||||
bench_vec_dedup_new(b, 100);
|
||||
fn bench_dedup_random_100(b: &mut Bencher) {
|
||||
bench_vec_dedup_random(b, 100);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_old_1000(b: &mut Bencher) {
|
||||
bench_vec_dedup_old(b, 1000);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_new_1000(b: &mut Bencher) {
|
||||
bench_vec_dedup_new(b, 1000);
|
||||
fn bench_dedup_none_100(b: &mut Bencher) {
|
||||
bench_vec_dedup_none(b, 100);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_old_10000(b: &mut Bencher) {
|
||||
bench_vec_dedup_old(b, 10000);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_new_10000(b: &mut Bencher) {
|
||||
bench_vec_dedup_new(b, 10000);
|
||||
fn bench_dedup_all_100(b: &mut Bencher) {
|
||||
bench_vec_dedup_all(b, 100);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_old_100000(b: &mut Bencher) {
|
||||
bench_vec_dedup_old(b, 100000);
|
||||
fn bench_dedup_slice_truncate_1000(b: &mut Bencher) {
|
||||
bench_dedup_slice_truncate(b, 1000);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_new_100000(b: &mut Bencher) {
|
||||
bench_vec_dedup_new(b, 100000);
|
||||
fn bench_dedup_random_1000(b: &mut Bencher) {
|
||||
bench_vec_dedup_random(b, 1000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_none_1000(b: &mut Bencher) {
|
||||
bench_vec_dedup_none(b, 1000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_all_1000(b: &mut Bencher) {
|
||||
bench_vec_dedup_all(b, 1000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_slice_truncate_10000(b: &mut Bencher) {
|
||||
bench_dedup_slice_truncate(b, 10000);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_random_10000(b: &mut Bencher) {
|
||||
bench_vec_dedup_random(b, 10000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_none_10000(b: &mut Bencher) {
|
||||
bench_vec_dedup_none(b, 10000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_all_10000(b: &mut Bencher) {
|
||||
bench_vec_dedup_all(b, 10000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_slice_truncate_100000(b: &mut Bencher) {
|
||||
bench_dedup_slice_truncate(b, 100000);
|
||||
}
|
||||
#[bench]
|
||||
fn bench_dedup_random_100000(b: &mut Bencher) {
|
||||
bench_vec_dedup_random(b, 100000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_none_100000(b: &mut Bencher) {
|
||||
bench_vec_dedup_none(b, 100000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_dedup_all_100000(b: &mut Bencher) {
|
||||
bench_vec_dedup_all(b, 100000);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
|
|
Loading…
Add table
Reference in a new issue