Skip to content

Commit b0092bc

Browse files
committed
Vec::dedup optimization - add benches
1 parent 96d6f22 commit b0092bc

File tree

3 files changed

+91
-1
lines changed

3 files changed

+91
-1
lines changed

library/alloc/benches/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![feature(btree_drain_filter)]
55
#![feature(map_first_last)]
66
#![feature(repr_simd)]
7+
#![feature(slice_partition_dedup)]
78
#![feature(test)]
89

910
extern crate test;

library/alloc/benches/vec.rs

+89
Original file line numberDiff line numberDiff line change
@@ -671,3 +671,92 @@ fn bench_map_fast(b: &mut Bencher) {
671671
let data = black_box([(0, 0); LEN]);
672672
b.iter(|| map_fast(&data));
673673
}
674+
675+
fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {
676+
let mask = if buf.len() < 8192 {
677+
0xFF
678+
} else if buf.len() < 200_000 {
679+
0xFFFF
680+
} else {
681+
0xFFFF_FFFF
682+
};
683+
684+
for item in buf.iter_mut() {
685+
seed ^= seed << 13;
686+
seed ^= seed >> 17;
687+
seed ^= seed << 5;
688+
689+
*item = seed & mask;
690+
}
691+
692+
buf.sort();
693+
}
694+
695+
fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) {
696+
let mut template = vec![0u32; sz];
697+
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
698+
random_sorted_fill(0x43, &mut template);
699+
700+
let mut vec = template.clone();
701+
b.iter(|| {
702+
let len = {
703+
let (dedup, _) = vec.partition_dedup();
704+
dedup.len()
705+
};
706+
vec.truncate(len);
707+
708+
black_box(vec.first());
709+
vec.clear();
710+
vec.extend_from_slice(&template);
711+
});
712+
}
713+
714+
fn bench_vec_dedup_new(b: &mut Bencher, sz: usize) {
715+
let mut template = vec![0u32; sz];
716+
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
717+
random_sorted_fill(0x43, &mut template);
718+
719+
let mut vec = template.clone();
720+
b.iter(|| {
721+
vec.dedup();
722+
black_box(vec.first());
723+
vec.clear();
724+
vec.extend_from_slice(&template);
725+
});
726+
}
727+
728+
#[bench]
729+
fn bench_dedup_old_100(b: &mut Bencher) {
730+
bench_vec_dedup_old(b, 100);
731+
}
732+
#[bench]
733+
fn bench_dedup_new_100(b: &mut Bencher) {
734+
bench_vec_dedup_new(b, 100);
735+
}
736+
737+
#[bench]
738+
fn bench_dedup_old_1000(b: &mut Bencher) {
739+
bench_vec_dedup_old(b, 1000);
740+
}
741+
#[bench]
742+
fn bench_dedup_new_1000(b: &mut Bencher) {
743+
bench_vec_dedup_new(b, 1000);
744+
}
745+
746+
#[bench]
747+
fn bench_dedup_old_10000(b: &mut Bencher) {
748+
bench_vec_dedup_old(b, 10000);
749+
}
750+
#[bench]
751+
fn bench_dedup_new_10000(b: &mut Bencher) {
752+
bench_vec_dedup_new(b, 10000);
753+
}
754+
755+
#[bench]
756+
fn bench_dedup_old_100000(b: &mut Bencher) {
757+
bench_vec_dedup_old(b, 100000);
758+
}
759+
#[bench]
760+
fn bench_dedup_new_100000(b: &mut Bencher) {
761+
bench_vec_dedup_new(b, 100000);
762+
}

library/alloc/tests/vec.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2267,4 +2267,4 @@ fn test_extend_from_within_panicing_clone() {
22672267
std::panic::catch_unwind(move || vec.extend_from_within(..)).unwrap_err();
22682268

22692269
assert_eq!(count.load(Ordering::SeqCst), 4);
2270-
}
2270+
}

0 commit comments

Comments
 (0)