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();
|
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];
|
let mut template = vec![0u32; sz];
|
||||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||||
random_sorted_fill(0x43, &mut template);
|
random_sorted_fill(0x43, &mut template);
|
||||||
|
|
||||||
let mut vec = template.clone();
|
let mut vec = template.clone();
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
|
let vec = black_box(&mut vec);
|
||||||
let len = {
|
let len = {
|
||||||
let (dedup, _) = vec.partition_dedup();
|
let (dedup, _) = vec.partition_dedup();
|
||||||
dedup.len()
|
dedup.len()
|
||||||
|
@ -672,59 +675,143 @@ fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) {
|
||||||
vec.truncate(len);
|
vec.truncate(len);
|
||||||
|
|
||||||
black_box(vec.first());
|
black_box(vec.first());
|
||||||
|
let vec = black_box(vec);
|
||||||
vec.clear();
|
vec.clear();
|
||||||
vec.extend_from_slice(&template);
|
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];
|
let mut template = vec![0u32; sz];
|
||||||
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
|
||||||
random_sorted_fill(0x43, &mut template);
|
random_sorted_fill(0x43, &mut template);
|
||||||
|
|
||||||
let mut vec = template.clone();
|
let mut vec = template.clone();
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
|
let vec = black_box(&mut vec);
|
||||||
vec.dedup();
|
vec.dedup();
|
||||||
black_box(vec.first());
|
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.clear();
|
||||||
vec.extend_from_slice(&template);
|
vec.extend_from_slice(&template);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_old_100(b: &mut Bencher) {
|
fn bench_dedup_slice_truncate_100(b: &mut Bencher) {
|
||||||
bench_vec_dedup_old(b, 100);
|
bench_dedup_slice_truncate(b, 100);
|
||||||
}
|
}
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_new_100(b: &mut Bencher) {
|
fn bench_dedup_random_100(b: &mut Bencher) {
|
||||||
bench_vec_dedup_new(b, 100);
|
bench_vec_dedup_random(b, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_old_1000(b: &mut Bencher) {
|
fn bench_dedup_none_100(b: &mut Bencher) {
|
||||||
bench_vec_dedup_old(b, 1000);
|
bench_vec_dedup_none(b, 100);
|
||||||
}
|
|
||||||
#[bench]
|
|
||||||
fn bench_dedup_new_1000(b: &mut Bencher) {
|
|
||||||
bench_vec_dedup_new(b, 1000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_old_10000(b: &mut Bencher) {
|
fn bench_dedup_all_100(b: &mut Bencher) {
|
||||||
bench_vec_dedup_old(b, 10000);
|
bench_vec_dedup_all(b, 100);
|
||||||
}
|
|
||||||
#[bench]
|
|
||||||
fn bench_dedup_new_10000(b: &mut Bencher) {
|
|
||||||
bench_vec_dedup_new(b, 10000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_old_100000(b: &mut Bencher) {
|
fn bench_dedup_slice_truncate_1000(b: &mut Bencher) {
|
||||||
bench_vec_dedup_old(b, 100000);
|
bench_dedup_slice_truncate(b, 1000);
|
||||||
}
|
}
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_dedup_new_100000(b: &mut Bencher) {
|
fn bench_dedup_random_1000(b: &mut Bencher) {
|
||||||
bench_vec_dedup_new(b, 100000);
|
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]
|
#[bench]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue