@@ -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+ }
0 commit comments