@@ -8,11 +8,13 @@ use self::test::Bencher;
8
8
use smallvec:: { ExtendFromSlice , SmallVec } ;
9
9
10
10
const VEC_SIZE : usize = 16 ;
11
+ const SPILLED_SIZE : usize = 100 ;
11
12
12
13
trait Vector < T > : for < ' a > From < & ' a [ T ] > + Extend < T > + ExtendFromSlice < T > {
13
14
fn new ( ) -> Self ;
14
15
fn push ( & mut self , val : T ) ;
15
16
fn pop ( & mut self ) -> Option < T > ;
17
+ fn remove ( & mut self , p : usize ) -> T ;
16
18
fn insert ( & mut self , n : usize , val : T ) ;
17
19
fn from_elem ( val : T , n : usize ) -> Self ;
18
20
}
@@ -21,15 +23,23 @@ impl<T: Copy> Vector<T> for Vec<T> {
21
23
fn new ( ) -> Self {
22
24
Self :: with_capacity ( VEC_SIZE )
23
25
}
26
+
24
27
fn push ( & mut self , val : T ) {
25
28
self . push ( val)
26
29
}
30
+
27
31
fn pop ( & mut self ) -> Option < T > {
28
32
self . pop ( )
29
33
}
34
+
35
+ fn remove ( & mut self , p : usize ) -> T {
36
+ self . remove ( p)
37
+ }
38
+
30
39
fn insert ( & mut self , n : usize , val : T ) {
31
40
self . insert ( n, val)
32
41
}
42
+
33
43
fn from_elem ( val : T , n : usize ) -> Self {
34
44
vec ! [ val; n]
35
45
}
@@ -39,15 +49,23 @@ impl<T: Copy> Vector<T> for SmallVec<[T; VEC_SIZE]> {
39
49
fn new ( ) -> Self {
40
50
Self :: new ( )
41
51
}
52
+
42
53
fn push ( & mut self , val : T ) {
43
54
self . push ( val)
44
55
}
56
+
45
57
fn pop ( & mut self ) -> Option < T > {
46
58
self . pop ( )
47
59
}
60
+
61
+ fn remove ( & mut self , p : usize ) -> T {
62
+ self . remove ( p)
63
+ }
64
+
48
65
fn insert ( & mut self , n : usize , val : T ) {
49
66
self . insert ( n, val)
50
67
}
68
+
51
69
fn from_elem ( val : T , n : usize ) -> Self {
52
70
smallvec ! [ val; n]
53
71
}
@@ -66,35 +84,39 @@ macro_rules! make_benches {
66
84
67
85
make_benches ! {
68
86
SmallVec <[ u64 ; VEC_SIZE ] > {
69
- bench_push => gen_push( 100 ) ,
87
+ bench_push => gen_push( SPILLED_SIZE as _ ) ,
70
88
bench_push_small => gen_push( VEC_SIZE as _) ,
71
- bench_insert => gen_insert( 100 ) ,
89
+ bench_insert => gen_insert( SPILLED_SIZE as _ ) ,
72
90
bench_insert_small => gen_insert( VEC_SIZE as _) ,
73
- bench_extend => gen_extend( 100 ) ,
91
+ bench_remove => gen_remove( SPILLED_SIZE as _) ,
92
+ bench_remove_small => gen_remove( VEC_SIZE as _) ,
93
+ bench_extend => gen_extend( SPILLED_SIZE as _) ,
74
94
bench_extend_small => gen_extend( VEC_SIZE as _) ,
75
- bench_from_slice => gen_from_slice( 100 ) ,
95
+ bench_from_slice => gen_from_slice( SPILLED_SIZE as _ ) ,
76
96
bench_from_slice_small => gen_from_slice( VEC_SIZE as _) ,
77
- bench_extend_from_slice => gen_extend_from_slice( 100 ) ,
97
+ bench_extend_from_slice => gen_extend_from_slice( SPILLED_SIZE as _ ) ,
78
98
bench_extend_from_slice_small => gen_extend_from_slice( VEC_SIZE as _) ,
79
- bench_macro_from_elem => gen_from_elem( 100 ) ,
99
+ bench_macro_from_elem => gen_from_elem( SPILLED_SIZE as _ ) ,
80
100
bench_macro_from_elem_small => gen_from_elem( VEC_SIZE as _) ,
81
101
bench_pushpop => gen_pushpop( ) ,
82
102
}
83
103
}
84
104
85
105
make_benches ! {
86
106
Vec <u64 > {
87
- bench_push_vec => gen_push( 100 ) ,
107
+ bench_push_vec => gen_push( SPILLED_SIZE as _ ) ,
88
108
bench_push_vec_small => gen_push( VEC_SIZE as _) ,
89
- bench_insert_vec => gen_insert( 100 ) ,
109
+ bench_insert_vec => gen_insert( SPILLED_SIZE as _ ) ,
90
110
bench_insert_vec_small => gen_insert( VEC_SIZE as _) ,
91
- bench_extend_vec => gen_extend( 100 ) ,
111
+ bench_remove_vec => gen_remove( SPILLED_SIZE as _) ,
112
+ bench_remove_vec_small => gen_remove( VEC_SIZE as _) ,
113
+ bench_extend_vec => gen_extend( SPILLED_SIZE as _) ,
92
114
bench_extend_vec_small => gen_extend( VEC_SIZE as _) ,
93
- bench_from_slice_vec => gen_from_slice( 100 ) ,
115
+ bench_from_slice_vec => gen_from_slice( SPILLED_SIZE as _ ) ,
94
116
bench_from_slice_vec_small => gen_from_slice( VEC_SIZE as _) ,
95
- bench_extend_from_slice_vec => gen_extend_from_slice( 100 ) ,
117
+ bench_extend_from_slice_vec => gen_extend_from_slice( SPILLED_SIZE as _ ) ,
96
118
bench_extend_from_slice_vec_small => gen_extend_from_slice( VEC_SIZE as _) ,
97
- bench_macro_from_elem_vec => gen_from_elem( 100 ) ,
119
+ bench_macro_from_elem_vec => gen_from_elem( SPILLED_SIZE as _ ) ,
98
120
bench_macro_from_elem_vec_small => gen_from_elem( VEC_SIZE as _) ,
99
121
bench_pushpop_vec => gen_pushpop( ) ,
100
122
}
@@ -117,19 +139,38 @@ fn gen_push<V: Vector<u64>>(n: u64, b: &mut Bencher) {
117
139
118
140
fn gen_insert < V : Vector < u64 > > ( n : u64 , b : & mut Bencher ) {
119
141
#[ inline( never) ]
120
- fn insert_noinline < V : Vector < u64 > > ( vec : & mut V , x : u64 ) {
121
- vec. insert ( 0 , x)
142
+ fn insert_noinline < V : Vector < u64 > > ( vec : & mut V , p : usize , x : u64 ) {
143
+ vec. insert ( p , x)
122
144
}
123
145
124
146
b. iter ( || {
125
147
let mut vec = V :: new ( ) ;
148
+ // Add one element, with each iteration we insert one before the end.
149
+ // This means that we benchmark the insertion operation and not the
150
+ // time it takes to `ptr::copy` the data.
151
+ vec. push ( 0 ) ;
126
152
for x in 0 ..n {
127
- insert_noinline ( & mut vec, x) ;
153
+ insert_noinline ( & mut vec, x as _ , x ) ;
128
154
}
129
155
vec
130
156
} ) ;
131
157
}
132
158
159
+ fn gen_remove < V : Vector < u64 > > ( n : usize , b : & mut Bencher ) {
160
+ #[ inline( never) ]
161
+ fn remove_noinline < V : Vector < u64 > > ( vec : & mut V , p : usize ) {
162
+ vec. remove ( p) ;
163
+ }
164
+
165
+ b. iter ( || {
166
+ let mut vec = V :: from_elem ( 0 , n as _ ) ;
167
+
168
+ for x in ( 0 ..n - 1 ) . rev ( ) {
169
+ remove_noinline ( & mut vec, x)
170
+ }
171
+ } ) ;
172
+ }
173
+
133
174
fn gen_extend < V : Vector < u64 > > ( n : u64 , b : & mut Bencher ) {
134
175
b. iter ( || {
135
176
let mut vec = V :: new ( ) ;
@@ -157,14 +198,14 @@ fn gen_extend_from_slice<V: Vector<u64>>(n: u64, b: &mut Bencher) {
157
198
158
199
fn gen_pushpop < V : Vector < u64 > > ( b : & mut Bencher ) {
159
200
#[ inline( never) ]
160
- fn pushpop_noinline < V : Vector < u64 > > ( vec : & mut V , x : u64 ) {
201
+ fn pushpop_noinline < V : Vector < u64 > > ( vec : & mut V , x : u64 ) -> Option < u64 > {
161
202
vec. push ( x) ;
162
- vec. pop ( ) ;
203
+ vec. pop ( )
163
204
}
164
205
165
206
b. iter ( || {
166
207
let mut vec = V :: new ( ) ;
167
- for x in 0 ..100 {
208
+ for x in 0 ..SPILLED_SIZE as _ {
168
209
pushpop_noinline ( & mut vec, x) ;
169
210
}
170
211
vec
@@ -191,15 +232,15 @@ fn bench_insert_many(b: &mut Bencher) {
191
232
192
233
b. iter ( || {
193
234
let mut vec = SmallVec :: < [ u64 ; VEC_SIZE ] > :: new ( ) ;
194
- insert_many_noinline ( & mut vec, 0 , 0 ..100 ) ;
195
- insert_many_noinline ( & mut vec, 0 , 0 ..100 ) ;
235
+ insert_many_noinline ( & mut vec, 0 , 0 ..SPILLED_SIZE as _ ) ;
236
+ insert_many_noinline ( & mut vec, 0 , 0 ..SPILLED_SIZE as _ ) ;
196
237
vec
197
238
} ) ;
198
239
}
199
240
200
241
#[ bench]
201
242
fn bench_insert_from_slice ( b : & mut Bencher ) {
202
- let v: Vec < u64 > = ( 0 ..100 ) . collect ( ) ;
243
+ let v: Vec < u64 > = ( 0 ..SPILLED_SIZE as _ ) . collect ( ) ;
203
244
b. iter ( || {
204
245
let mut vec = SmallVec :: < [ u64 ; VEC_SIZE ] > :: new ( ) ;
205
246
vec. insert_from_slice ( 0 , & v) ;
0 commit comments