8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use std:: { mem, ptr} ;
12
- use std:: __rand:: { Rng , thread_rng} ;
11
+ use std:: __rand:: { thread_rng} ;
12
+ use std:: mem;
13
+ use std:: ptr;
13
14
15
+ use rand:: { Rng , SeedableRng , XorShiftRng } ;
14
16
use test:: { Bencher , black_box} ;
15
17
16
18
#[ bench]
@@ -191,17 +193,17 @@ fn gen_descending(len: usize) -> Vec<u64> {
191
193
}
192
194
193
195
fn gen_random ( len : usize ) -> Vec < u64 > {
194
- let mut rng = thread_rng ( ) ;
196
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
195
197
rng. gen_iter :: < u64 > ( ) . take ( len) . collect ( )
196
198
}
197
199
198
200
fn gen_random_bytes ( len : usize ) -> Vec < u8 > {
199
- let mut rng = thread_rng ( ) ;
201
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
200
202
rng. gen_iter :: < u8 > ( ) . take ( len) . collect ( )
201
203
}
202
204
203
205
fn gen_mostly_ascending ( len : usize ) -> Vec < u64 > {
204
- let mut rng = thread_rng ( ) ;
206
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
205
207
let mut v = gen_ascending ( len) ;
206
208
for _ in ( 0usize ..) . take_while ( |x| x * x <= len) {
207
209
let x = rng. gen :: < usize > ( ) % len;
@@ -212,7 +214,7 @@ fn gen_mostly_ascending(len: usize) -> Vec<u64> {
212
214
}
213
215
214
216
fn gen_mostly_descending ( len : usize ) -> Vec < u64 > {
215
- let mut rng = thread_rng ( ) ;
217
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
216
218
let mut v = gen_descending ( len) ;
217
219
for _ in ( 0usize ..) . take_while ( |x| x * x <= len) {
218
220
let x = rng. gen :: < usize > ( ) % len;
@@ -223,7 +225,7 @@ fn gen_mostly_descending(len: usize) -> Vec<u64> {
223
225
}
224
226
225
227
fn gen_strings ( len : usize ) -> Vec < String > {
226
- let mut rng = thread_rng ( ) ;
228
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
227
229
let mut v = vec ! [ ] ;
228
230
for _ in 0 ..len {
229
231
let n = rng. gen :: < usize > ( ) % 20 + 1 ;
@@ -233,26 +235,40 @@ fn gen_strings(len: usize) -> Vec<String> {
233
235
}
234
236
235
237
fn gen_big_random ( len : usize ) -> Vec < [ u64 ; 16 ] > {
236
- let mut rng = thread_rng ( ) ;
238
+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
237
239
rng. gen_iter ( ) . map ( |x| [ x; 16 ] ) . take ( len) . collect ( )
238
240
}
239
241
240
242
macro_rules! sort {
241
243
( $f: ident, $name: ident, $gen: expr, $len: expr) => {
242
244
#[ bench]
243
245
fn $name( b: & mut Bencher ) {
244
- b. iter( || $gen( $len) . $f( ) ) ;
246
+ let v = $gen( $len) ;
247
+ b. iter( || v. clone( ) . $f( ) ) ;
245
248
b. bytes = $len * mem:: size_of_val( & $gen( 1 ) [ 0 ] ) as u64 ;
246
249
}
247
250
}
248
251
}
249
252
253
+ macro_rules! sort_strings {
254
+ ( $f: ident, $name: ident, $gen: expr, $len: expr) => {
255
+ #[ bench]
256
+ fn $name( b: & mut Bencher ) {
257
+ let v = $gen( $len) ;
258
+ let v = v. iter( ) . map( |s| & * * s) . collect:: <Vec <& str >>( ) ;
259
+ b. iter( || v. clone( ) . $f( ) ) ;
260
+ b. bytes = $len * mem:: size_of:: <& str >( ) as u64 ;
261
+ }
262
+ }
263
+ }
264
+
250
265
macro_rules! sort_expensive {
251
266
( $f: ident, $name: ident, $gen: expr, $len: expr) => {
252
267
#[ bench]
253
268
fn $name( b: & mut Bencher ) {
269
+ let v = $gen( $len) ;
254
270
b. iter( || {
255
- let mut v = $gen ( $len ) ;
271
+ let mut v = v . clone ( ) ;
256
272
let mut count = 0 ;
257
273
v. $f( |a: & u64 , b: & u64 | {
258
274
count += 1 ;
@@ -263,38 +279,38 @@ macro_rules! sort_expensive {
263
279
} ) ;
264
280
black_box( count) ;
265
281
} ) ;
266
- b. bytes = $len as u64 * mem:: size_of :: < u64 > ( ) as u64 ;
282
+ b. bytes = $len * mem:: size_of_val ( & $gen ( 1 ) [ 0 ] ) as u64 ;
267
283
}
268
284
}
269
285
}
270
286
271
287
sort ! ( sort, sort_small_ascending, gen_ascending, 10 ) ;
272
288
sort ! ( sort, sort_small_descending, gen_descending, 10 ) ;
273
289
sort ! ( sort, sort_small_random, gen_random, 10 ) ;
274
- sort ! ( sort, sort_small_big_random , gen_big_random, 10 ) ;
290
+ sort ! ( sort, sort_small_big , gen_big_random, 10 ) ;
275
291
sort ! ( sort, sort_medium_random, gen_random, 100 ) ;
276
292
sort ! ( sort, sort_large_ascending, gen_ascending, 10000 ) ;
277
293
sort ! ( sort, sort_large_descending, gen_descending, 10000 ) ;
278
294
sort ! ( sort, sort_large_mostly_ascending, gen_mostly_ascending, 10000 ) ;
279
295
sort ! ( sort, sort_large_mostly_descending, gen_mostly_descending, 10000 ) ;
280
296
sort ! ( sort, sort_large_random, gen_random, 10000 ) ;
281
- sort ! ( sort, sort_large_big_random , gen_big_random, 10000 ) ;
282
- sort ! ( sort, sort_large_strings, gen_strings, 10000 ) ;
283
- sort_expensive ! ( sort_by, sort_large_random_expensive , gen_random, 10000 ) ;
297
+ sort ! ( sort, sort_large_big , gen_big_random, 10000 ) ;
298
+ sort_strings ! ( sort, sort_large_strings, gen_strings, 10000 ) ;
299
+ sort_expensive ! ( sort_by, sort_large_expensive , gen_random, 10000 ) ;
284
300
285
301
sort ! ( sort_unstable, sort_unstable_small_ascending, gen_ascending, 10 ) ;
286
302
sort ! ( sort_unstable, sort_unstable_small_descending, gen_descending, 10 ) ;
287
303
sort ! ( sort_unstable, sort_unstable_small_random, gen_random, 10 ) ;
288
- sort ! ( sort_unstable, sort_unstable_small_big_random , gen_big_random, 10 ) ;
304
+ sort ! ( sort_unstable, sort_unstable_small_big , gen_big_random, 10 ) ;
289
305
sort ! ( sort_unstable, sort_unstable_medium_random, gen_random, 100 ) ;
290
306
sort ! ( sort_unstable, sort_unstable_large_ascending, gen_ascending, 10000 ) ;
291
307
sort ! ( sort_unstable, sort_unstable_large_descending, gen_descending, 10000 ) ;
292
308
sort ! ( sort_unstable, sort_unstable_large_mostly_ascending, gen_mostly_ascending, 10000 ) ;
293
309
sort ! ( sort_unstable, sort_unstable_large_mostly_descending, gen_mostly_descending, 10000 ) ;
294
310
sort ! ( sort_unstable, sort_unstable_large_random, gen_random, 10000 ) ;
295
- sort ! ( sort_unstable, sort_unstable_large_big_random , gen_big_random, 10000 ) ;
296
- sort ! ( sort_unstable, sort_unstable_large_strings, gen_strings, 10000 ) ;
297
- sort_expensive ! ( sort_unstable_by, sort_unstable_large_random_expensive , gen_random, 10000 ) ;
311
+ sort ! ( sort_unstable, sort_unstable_large_big , gen_big_random, 10000 ) ;
312
+ sort_strings ! ( sort_unstable, sort_unstable_large_strings, gen_strings, 10000 ) ;
313
+ sort_expensive ! ( sort_unstable_by, sort_unstable_large_expensive , gen_random, 10000 ) ;
298
314
299
315
macro_rules! reverse {
300
316
( $name: ident, $ty: ty, $f: expr) => {
0 commit comments