1+ #![ feature( test) ]
2+
3+ extern crate test;
4+ use test:: { black_box, Bencher } ;
5+
6+ extern crate compiler_builtins;
7+ use compiler_builtins:: mem:: { memcpy, memset, memcmp} ;
8+
9+ fn memcpy_builtin ( b : & mut Bencher , n : usize ) {
10+ let v1 = vec ! [ 1u8 ; n] ;
11+ let mut v2 = vec ! [ 0u8 ; n] ;
12+ b. iter ( || {
13+ let src: & [ u8 ] = black_box ( & v1) ;
14+ let dst: & mut [ u8 ] = black_box ( & mut v2) ;
15+ dst. copy_from_slice ( src) ;
16+ } )
17+ }
18+
19+ fn memcpy_rust ( b : & mut Bencher , n : usize ) {
20+ let v1 = vec ! [ 1u8 ; n] ;
21+ let mut v2 = vec ! [ 0u8 ; n] ;
22+ b. iter ( || {
23+ let src: & [ u8 ] = black_box ( & v1) ;
24+ let dst: & mut [ u8 ] = black_box ( & mut v2) ;
25+ unsafe { memcpy ( dst. as_mut_ptr ( ) , src. as_ptr ( ) , n) }
26+ } )
27+ }
28+
29+ fn memset_builtin ( b : & mut Bencher , n : usize ) {
30+ let mut v1 = vec ! [ 0u8 ; n] ;
31+ b. iter ( || {
32+ let dst: & mut [ u8 ] = black_box ( & mut v1) ;
33+ let val: u8 = black_box ( 27 ) ;
34+ for b in dst {
35+ * b = val;
36+ }
37+ } )
38+ }
39+
40+ fn memset_rust ( b : & mut Bencher , n : usize ) {
41+ let mut v1 = vec ! [ 0u8 ; n] ;
42+ b. iter ( || {
43+ let dst: & mut [ u8 ] = black_box ( & mut v1) ;
44+ let val = black_box ( 27 ) ;
45+ unsafe { memset ( dst. as_mut_ptr ( ) , val, n) }
46+ } )
47+ }
48+
49+ fn memcmp_builtin ( b : & mut Bencher , n : usize ) {
50+ let v1 = vec ! [ 0u8 ; n] ;
51+ let mut v2 = vec ! [ 0u8 ; n] ;
52+ v2[ n-1 ] = 1 ;
53+ b. iter ( || {
54+ let s1: & [ u8 ] = black_box ( & v1) ;
55+ let s2: & [ u8 ] = black_box ( & v2) ;
56+ s1. cmp ( s2)
57+ } )
58+ }
59+
60+ fn memcmp_rust ( b : & mut Bencher , n : usize ) {
61+ let v1 = vec ! [ 0u8 ; n] ;
62+ let mut v2 = vec ! [ 0u8 ; n] ;
63+ v2[ n-1 ] = 1 ;
64+ b. iter ( || {
65+ let s1: & [ u8 ] = black_box ( & v1) ;
66+ let s2: & [ u8 ] = black_box ( & v2) ;
67+ unsafe { memcmp ( s1. as_ptr ( ) , s2. as_ptr ( ) , n) }
68+ } )
69+ }
70+
71+ #[ bench]
72+ fn memcpy_builtin_4096 ( b : & mut Bencher ) {
73+ memcpy_builtin ( b, 4096 )
74+ }
75+ #[ bench]
76+ fn memcpy_rust_4096 ( b : & mut Bencher ) {
77+ memcpy_rust ( b, 4096 )
78+ }
79+ #[ bench]
80+ fn memcpy_builtin_1048576 ( b : & mut Bencher ) {
81+ memcpy_builtin ( b, 1048576 )
82+ }
83+ #[ bench]
84+ fn memcpy_rust_1048576 ( b : & mut Bencher ) {
85+ memcpy_rust ( b, 1048576 )
86+ }
87+
88+ #[ bench]
89+ fn memset_builtin_4096 ( b : & mut Bencher ) {
90+ memset_builtin ( b, 4096 )
91+ }
92+ #[ bench]
93+ fn memset_rust_4096 ( b : & mut Bencher ) {
94+ memset_rust ( b, 4096 )
95+ }
96+ #[ bench]
97+ fn memset_builtin_1048576 ( b : & mut Bencher ) {
98+ memset_builtin ( b, 1048576 )
99+ }
100+ #[ bench]
101+ fn memset_rust_1048576 ( b : & mut Bencher ) {
102+ memset_rust ( b, 1048576 )
103+ }
104+
105+ #[ bench]
106+ fn memcmp_builtin_4096 ( b : & mut Bencher ) {
107+ memcmp_builtin ( b, 4096 )
108+ }
109+ #[ bench]
110+ fn memcmp_rust_4096 ( b : & mut Bencher ) {
111+ memcmp_rust ( b, 4096 )
112+ }
113+ #[ bench]
114+ fn memcmp_builtin_1048576 ( b : & mut Bencher ) {
115+ memcmp_builtin ( b, 1048576 )
116+ }
117+ #[ bench]
118+ fn memcmp_rust_1048576 ( b : & mut Bencher ) {
119+ memcmp_rust ( b, 1048576 )
120+ }
0 commit comments