@@ -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