File tree Expand file tree Collapse file tree 1 file changed +37
-0
lines changed Expand file tree Collapse file tree 1 file changed +37
-0
lines changed Original file line number Diff line number Diff line change
1
+ use rand:: prelude:: * ;
1
2
use std:: iter:: { repeat, FromIterator } ;
2
3
use test:: { black_box, Bencher } ;
3
4
@@ -551,6 +552,42 @@ fn bench_in_place_recycle(b: &mut test::Bencher) {
551
552
} ) ;
552
553
}
553
554
555
+ #[ bench]
556
+ fn bench_in_place_zip_recycle ( b : & mut test:: Bencher ) {
557
+ let mut data = vec ! [ 0u8 ; 256 ] ;
558
+ let mut rng = rand:: thread_rng ( ) ;
559
+ let mut subst = ( 0 ..=255u8 ) . collect :: < Vec < _ > > ( ) ;
560
+ subst. shuffle ( & mut rng) ;
561
+
562
+ b. iter ( || {
563
+ let tmp = std:: mem:: replace ( & mut data, Vec :: new ( ) ) ;
564
+ let mangled = tmp
565
+ . into_iter ( )
566
+ . zip ( subst. iter ( ) . copied ( ) )
567
+ . enumerate ( )
568
+ . map ( |( i, ( d, s) ) | d. wrapping_add ( i as u8 ) ^ s)
569
+ . collect :: < Vec < _ > > ( ) ;
570
+ assert_eq ! ( mangled. len( ) , 256 ) ;
571
+ std:: mem:: replace ( & mut data, black_box ( mangled) ) ;
572
+ } ) ;
573
+ }
574
+
575
+ #[ bench]
576
+ fn bench_in_place_zip_iter_mut ( b : & mut test:: Bencher ) {
577
+ let mut data = vec ! [ 0u8 ; 256 ] ;
578
+ let mut rng = rand:: thread_rng ( ) ;
579
+ let mut subst = ( 0 ..=255u8 ) . collect :: < Vec < _ > > ( ) ;
580
+ subst. shuffle ( & mut rng) ;
581
+
582
+ b. iter ( || {
583
+ data. iter_mut ( ) . enumerate ( ) . for_each ( |( i, d) | {
584
+ * d = d. wrapping_add ( i as u8 ) ^ subst[ i] ;
585
+ } ) ;
586
+ } ) ;
587
+
588
+ black_box ( data) ;
589
+ }
590
+
554
591
#[ derive( Clone ) ]
555
592
struct Droppable ( usize ) ;
556
593
You can’t perform that action at this time.
0 commit comments