Skip to content

Commit 0c6901a

Browse files
Add more benchmarks of Vec::dedup
They are for more specific cases than old benches. Also, better usage of blackbox
1 parent 1db4b12 commit 0c6901a

File tree

1 file changed

+105
-18
lines changed

1 file changed

+105
-18
lines changed

library/alloc/benches/vec.rs

+105-18
Original file line numberDiff line numberDiff line change
@@ -658,73 +658,160 @@ fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {
658658
buf.sort();
659659
}
660660

661-
fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) {
661+
// Measures performance of slice dedup impl.
662+
// "Old" implementation of Vec::dedup
663+
fn bench_dedup_slice_truncate(b: &mut Bencher, sz: usize) {
662664
let mut template = vec![0u32; sz];
663665
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
664666
random_sorted_fill(0x43, &mut template);
665667

666668
let mut vec = template.clone();
667669
b.iter(|| {
670+
let vec = black_box(&mut vec);
668671
let len = {
669672
let (dedup, _) = vec.partition_dedup();
670673
dedup.len()
671674
};
672675
vec.truncate(len);
673676

674677
black_box(vec.first());
678+
let vec = black_box(vec);
675679
vec.clear();
676680
vec.extend_from_slice(&template);
677681
});
678682
}
679683

680-
fn bench_vec_dedup_new(b: &mut Bencher, sz: usize) {
684+
// Measures performance of Vec::dedup on random data.
685+
fn bench_vec_dedup_random(b: &mut Bencher, sz: usize) {
681686
let mut template = vec![0u32; sz];
682687
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
683688
random_sorted_fill(0x43, &mut template);
684689

685690
let mut vec = template.clone();
686691
b.iter(|| {
692+
let vec = black_box(&mut vec);
687693
vec.dedup();
688694
black_box(vec.first());
695+
let vec = black_box(vec);
696+
vec.clear();
697+
vec.extend_from_slice(&template);
698+
});
699+
}
700+
701+
// Measures performance of Vec::dedup when there is no items removed
702+
fn bench_vec_dedup_none(b: &mut Bencher, sz: usize) {
703+
let mut template = vec![0u32; sz];
704+
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
705+
template.chunks_exact_mut(2).for_each(|w| {
706+
w[0] = black_box(0);
707+
w[1] = black_box(5);
708+
});
709+
710+
let mut vec = template.clone();
711+
b.iter(|| {
712+
let vec = black_box(&mut vec);
713+
vec.dedup();
714+
black_box(vec.first());
715+
// Unlike other benches of `dedup`
716+
// this doesn't reinitialize vec
717+
// because we measure how effecient dedup is
718+
// when no memory written
719+
});
720+
}
721+
722+
// Measures performance of Vec::dedup when there is all items removed
723+
fn bench_vec_dedup_all(b: &mut Bencher, sz: usize) {
724+
let mut template = vec![0u32; sz];
725+
b.bytes = std::mem::size_of_val(template.as_slice()) as u64;
726+
template.iter_mut().for_each(|w| {
727+
*w = black_box(0);
728+
});
729+
730+
let mut vec = template.clone();
731+
b.iter(|| {
732+
let vec = black_box(&mut vec);
733+
vec.dedup();
734+
black_box(vec.first());
735+
let vec = black_box(vec);
689736
vec.clear();
690737
vec.extend_from_slice(&template);
691738
});
692739
}
693740

694741
#[bench]
695-
fn bench_dedup_old_100(b: &mut Bencher) {
696-
bench_vec_dedup_old(b, 100);
742+
fn bench_dedup_slice_truncate_100(b: &mut Bencher) {
743+
bench_dedup_slice_truncate(b, 100);
697744
}
698745
#[bench]
699-
fn bench_dedup_new_100(b: &mut Bencher) {
700-
bench_vec_dedup_new(b, 100);
746+
fn bench_dedup_random_100(b: &mut Bencher) {
747+
bench_vec_dedup_random(b, 100);
701748
}
702749

703750
#[bench]
704-
fn bench_dedup_old_1000(b: &mut Bencher) {
705-
bench_vec_dedup_old(b, 1000);
751+
fn bench_dedup_none_100(b: &mut Bencher) {
752+
bench_vec_dedup_none(b, 100);
706753
}
754+
755+
#[bench]
756+
fn bench_dedup_all_100(b: &mut Bencher) {
757+
bench_vec_dedup_all(b, 100);
758+
}
759+
760+
#[bench]
761+
fn bench_dedup_slice_truncate_1000(b: &mut Bencher) {
762+
bench_dedup_slice_truncate(b, 1000);
763+
}
764+
#[bench]
765+
fn bench_dedup_random_1000(b: &mut Bencher) {
766+
bench_vec_dedup_random(b, 1000);
767+
}
768+
769+
#[bench]
770+
fn bench_dedup_none_1000(b: &mut Bencher) {
771+
bench_vec_dedup_none(b, 1000);
772+
}
773+
707774
#[bench]
708-
fn bench_dedup_new_1000(b: &mut Bencher) {
709-
bench_vec_dedup_new(b, 1000);
775+
fn bench_dedup_all_1000(b: &mut Bencher) {
776+
bench_vec_dedup_all(b, 1000);
710777
}
711778

712779
#[bench]
713-
fn bench_dedup_old_10000(b: &mut Bencher) {
714-
bench_vec_dedup_old(b, 10000);
780+
fn bench_dedup_slice_truncate_10000(b: &mut Bencher) {
781+
bench_dedup_slice_truncate(b, 10000);
715782
}
716783
#[bench]
717-
fn bench_dedup_new_10000(b: &mut Bencher) {
718-
bench_vec_dedup_new(b, 10000);
784+
fn bench_dedup_random_10000(b: &mut Bencher) {
785+
bench_vec_dedup_random(b, 10000);
719786
}
720787

721788
#[bench]
722-
fn bench_dedup_old_100000(b: &mut Bencher) {
723-
bench_vec_dedup_old(b, 100000);
789+
fn bench_dedup_none_10000(b: &mut Bencher) {
790+
bench_vec_dedup_none(b, 10000);
724791
}
792+
793+
#[bench]
794+
fn bench_dedup_all_10000(b: &mut Bencher) {
795+
bench_vec_dedup_all(b, 10000);
796+
}
797+
798+
#[bench]
799+
fn bench_dedup_slice_truncate_100000(b: &mut Bencher) {
800+
bench_dedup_slice_truncate(b, 100000);
801+
}
802+
#[bench]
803+
fn bench_dedup_random_100000(b: &mut Bencher) {
804+
bench_vec_dedup_random(b, 100000);
805+
}
806+
807+
#[bench]
808+
fn bench_dedup_none_100000(b: &mut Bencher) {
809+
bench_vec_dedup_none(b, 100000);
810+
}
811+
725812
#[bench]
726-
fn bench_dedup_new_100000(b: &mut Bencher) {
727-
bench_vec_dedup_new(b, 100000);
813+
fn bench_dedup_all_100000(b: &mut Bencher) {
814+
bench_vec_dedup_all(b, 100000);
728815
}
729816

730817
#[bench]

0 commit comments

Comments
 (0)