Vec::dedup optimization - add benches
This commit is contained in:
parent
96d6f22a8e
commit
b0092bc995
3 changed files with 91 additions and 1 deletions
|
@ -4,6 +4,7 @@
|
||||||
#![feature(btree_drain_filter)]
|
#![feature(btree_drain_filter)]
|
||||||
#![feature(map_first_last)]
|
#![feature(map_first_last)]
|
||||||
#![feature(repr_simd)]
|
#![feature(repr_simd)]
|
||||||
|
#![feature(slice_partition_dedup)]
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
|
@ -671,3 +671,92 @@ fn bench_map_fast(b: &mut Bencher) {
|
||||||
let data = black_box([(0, 0); LEN]);
|
let data = black_box([(0, 0); LEN]);
|
||||||
b.iter(|| map_fast(&data));
|
b.iter(|| map_fast(&data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {
|
||||||
|
let mask = if buf.len() < 8192 {
|
||||||
|
0xFF
|
||||||
|
} else if buf.len() < 200_000 {
|
||||||
|
0xFFFF
|
||||||
|
} else {
|
||||||
|
0xFFFF_FFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
for item in buf.iter_mut() {
|
||||||
|
seed ^= seed << 13;
|
||||||
|
seed ^= seed >> 17;
|
||||||
|
seed ^= seed << 5;
|
||||||
|
|
||||||
|
*item = seed & mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.sort();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bench_vec_dedup_old(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 len = {
|
||||||
|
let (dedup, _) = vec.partition_dedup();
|
||||||
|
dedup.len()
|
||||||
|
};
|
||||||
|
vec.truncate(len);
|
||||||
|
|
||||||
|
black_box(vec.first());
|
||||||
|
vec.clear();
|
||||||
|
vec.extend_from_slice(&template);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bench_vec_dedup_new(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(|| {
|
||||||
|
vec.dedup();
|
||||||
|
black_box(vec.first());
|
||||||
|
vec.clear();
|
||||||
|
vec.extend_from_slice(&template);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_dedup_old_100(b: &mut Bencher) {
|
||||||
|
bench_vec_dedup_old(b, 100);
|
||||||
|
}
|
||||||
|
#[bench]
|
||||||
|
fn bench_dedup_new_100(b: &mut Bencher) {
|
||||||
|
bench_vec_dedup_new(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_dedup_old_100000(b: &mut Bencher) {
|
||||||
|
bench_vec_dedup_old(b, 100000);
|
||||||
|
}
|
||||||
|
#[bench]
|
||||||
|
fn bench_dedup_new_100000(b: &mut Bencher) {
|
||||||
|
bench_vec_dedup_new(b, 100000);
|
||||||
|
}
|
||||||
|
|
|
@ -2267,4 +2267,4 @@ fn test_extend_from_within_panicing_clone() {
|
||||||
std::panic::catch_unwind(move || vec.extend_from_within(..)).unwrap_err();
|
std::panic::catch_unwind(move || vec.extend_from_within(..)).unwrap_err();
|
||||||
|
|
||||||
assert_eq!(count.load(Ordering::SeqCst), 4);
|
assert_eq!(count.load(Ordering::SeqCst), 4);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue