88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
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;
1314
15+ use rand:: { Rng , SeedableRng , XorShiftRng } ;
1416use test:: { Bencher , black_box} ;
1517
1618#[ bench]
@@ -191,17 +193,17 @@ fn gen_descending(len: usize) -> Vec<u64> {
191193}
192194
193195fn gen_random ( len : usize ) -> Vec < u64 > {
194- let mut rng = thread_rng ( ) ;
196+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
195197 rng. gen_iter :: < u64 > ( ) . take ( len) . collect ( )
196198}
197199
198200fn gen_random_bytes ( len : usize ) -> Vec < u8 > {
199- let mut rng = thread_rng ( ) ;
201+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
200202 rng. gen_iter :: < u8 > ( ) . take ( len) . collect ( )
201203}
202204
203205fn gen_mostly_ascending ( len : usize ) -> Vec < u64 > {
204- let mut rng = thread_rng ( ) ;
206+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
205207 let mut v = gen_ascending ( len) ;
206208 for _ in ( 0usize ..) . take_while ( |x| x * x <= len) {
207209 let x = rng. gen :: < usize > ( ) % len;
@@ -212,7 +214,7 @@ fn gen_mostly_ascending(len: usize) -> Vec<u64> {
212214}
213215
214216fn gen_mostly_descending ( len : usize ) -> Vec < u64 > {
215- let mut rng = thread_rng ( ) ;
217+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
216218 let mut v = gen_descending ( len) ;
217219 for _ in ( 0usize ..) . take_while ( |x| x * x <= len) {
218220 let x = rng. gen :: < usize > ( ) % len;
@@ -223,7 +225,7 @@ fn gen_mostly_descending(len: usize) -> Vec<u64> {
223225}
224226
225227fn gen_strings ( len : usize ) -> Vec < String > {
226- let mut rng = thread_rng ( ) ;
228+ let mut rng = XorShiftRng :: from_seed ( [ 0 , 1 , 2 , 3 ] ) ;
227229 let mut v = vec ! [ ] ;
228230 for _ in 0 ..len {
229231 let n = rng. gen :: < usize > ( ) % 20 + 1 ;
@@ -233,26 +235,40 @@ fn gen_strings(len: usize) -> Vec<String> {
233235}
234236
235237fn 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 ] ) ;
237239 rng. gen_iter ( ) . map ( |x| [ x; 16 ] ) . take ( len) . collect ( )
238240}
239241
240242macro_rules! sort {
241243 ( $f: ident, $name: ident, $gen: expr, $len: expr) => {
242244 #[ bench]
243245 fn $name( b: & mut Bencher ) {
244- b. iter( || $gen( $len) . $f( ) ) ;
246+ let v = $gen( $len) ;
247+ b. iter( || v. clone( ) . $f( ) ) ;
245248 b. bytes = $len * mem:: size_of_val( & $gen( 1 ) [ 0 ] ) as u64 ;
246249 }
247250 }
248251}
249252
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+
250265macro_rules! sort_expensive {
251266 ( $f: ident, $name: ident, $gen: expr, $len: expr) => {
252267 #[ bench]
253268 fn $name( b: & mut Bencher ) {
269+ let v = $gen( $len) ;
254270 b. iter( || {
255- let mut v = $gen ( $len ) ;
271+ let mut v = v . clone ( ) ;
256272 let mut count = 0 ;
257273 v. $f( |a: & u64 , b: & u64 | {
258274 count += 1 ;
@@ -263,38 +279,38 @@ macro_rules! sort_expensive {
263279 } ) ;
264280 black_box( count) ;
265281 } ) ;
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 ;
267283 }
268284 }
269285}
270286
271287sort ! ( sort, sort_small_ascending, gen_ascending, 10 ) ;
272288sort ! ( sort, sort_small_descending, gen_descending, 10 ) ;
273289sort ! ( 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 ) ;
275291sort ! ( sort, sort_medium_random, gen_random, 100 ) ;
276292sort ! ( sort, sort_large_ascending, gen_ascending, 10000 ) ;
277293sort ! ( sort, sort_large_descending, gen_descending, 10000 ) ;
278294sort ! ( sort, sort_large_mostly_ascending, gen_mostly_ascending, 10000 ) ;
279295sort ! ( sort, sort_large_mostly_descending, gen_mostly_descending, 10000 ) ;
280296sort ! ( 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 ) ;
284300
285301sort ! ( sort_unstable, sort_unstable_small_ascending, gen_ascending, 10 ) ;
286302sort ! ( sort_unstable, sort_unstable_small_descending, gen_descending, 10 ) ;
287303sort ! ( 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 ) ;
289305sort ! ( sort_unstable, sort_unstable_medium_random, gen_random, 100 ) ;
290306sort ! ( sort_unstable, sort_unstable_large_ascending, gen_ascending, 10000 ) ;
291307sort ! ( sort_unstable, sort_unstable_large_descending, gen_descending, 10000 ) ;
292308sort ! ( sort_unstable, sort_unstable_large_mostly_ascending, gen_mostly_ascending, 10000 ) ;
293309sort ! ( sort_unstable, sort_unstable_large_mostly_descending, gen_mostly_descending, 10000 ) ;
294310sort ! ( 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 ) ;
298314
299315macro_rules! reverse {
300316 ( $name: ident, $ty: ty, $f: expr) => {
0 commit comments