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