@@ -658,73 +658,160 @@ fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {
658
658
buf. sort ( ) ;
659
659
}
660
660
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 ) {
662
664
let mut template = vec ! [ 0u32 ; sz] ;
663
665
b. bytes = std:: mem:: size_of_val ( template. as_slice ( ) ) as u64 ;
664
666
random_sorted_fill ( 0x43 , & mut template) ;
665
667
666
668
let mut vec = template. clone ( ) ;
667
669
b. iter ( || {
670
+ let vec = black_box ( & mut vec) ;
668
671
let len = {
669
672
let ( dedup, _) = vec. partition_dedup ( ) ;
670
673
dedup. len ( )
671
674
} ;
672
675
vec. truncate ( len) ;
673
676
674
677
black_box ( vec. first ( ) ) ;
678
+ let vec = black_box ( vec) ;
675
679
vec. clear ( ) ;
676
680
vec. extend_from_slice ( & template) ;
677
681
} ) ;
678
682
}
679
683
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 ) {
681
686
let mut template = vec ! [ 0u32 ; sz] ;
682
687
b. bytes = std:: mem:: size_of_val ( template. as_slice ( ) ) as u64 ;
683
688
random_sorted_fill ( 0x43 , & mut template) ;
684
689
685
690
let mut vec = template. clone ( ) ;
686
691
b. iter ( || {
692
+ let vec = black_box ( & mut vec) ;
687
693
vec. dedup ( ) ;
688
694
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) ;
689
736
vec. clear ( ) ;
690
737
vec. extend_from_slice ( & template) ;
691
738
} ) ;
692
739
}
693
740
694
741
#[ 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 ) ;
697
744
}
698
745
#[ 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 ) ;
701
748
}
702
749
703
750
#[ 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 ) ;
706
753
}
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
+
707
774
#[ 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 ) ;
710
777
}
711
778
712
779
#[ 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 ) ;
715
782
}
716
783
#[ 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 ) ;
719
786
}
720
787
721
788
#[ 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 ) ;
724
791
}
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
+
725
812
#[ 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 ) ;
728
815
}
729
816
730
817
#[ bench]
0 commit comments