1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 use std::__rand::{Rng, thread_rng};
14 use test::{Bencher, black_box};
17 fn iterator(b: &mut Bencher) {
18 // peculiar numbers to stop LLVM from optimising the summation
20 let v: Vec<_> = (0..100).map(|i| i ^ (i << 1) ^ (i >> 1)).collect();
27 // sum == 11806, to stop dead code elimination.
35 fn mut_iterator(b: &mut Bencher) {
36 let mut v = vec![0; 100];
48 fn concat(b: &mut Bencher) {
49 let xss: Vec<Vec<i32>> = (0..100).map(|i| (0..i).collect()).collect();
56 fn join(b: &mut Bencher) {
57 let xss: Vec<Vec<i32>> = (0..100).map(|i| (0..i).collect()).collect();
58 b.iter(|| xss.join(&0));
62 fn push(b: &mut Bencher) {
63 let mut vec = Vec::<i32>::new();
71 fn starts_with_same_vector(b: &mut Bencher) {
72 let vec: Vec<_> = (0..100).collect();
73 b.iter(|| vec.starts_with(&vec))
77 fn starts_with_single_element(b: &mut Bencher) {
78 let vec: Vec<_> = vec![0];
79 b.iter(|| vec.starts_with(&vec))
83 fn starts_with_diff_one_element_at_end(b: &mut Bencher) {
84 let vec: Vec<_> = (0..100).collect();
85 let mut match_vec: Vec<_> = (0..99).collect();
87 b.iter(|| vec.starts_with(&match_vec))
91 fn ends_with_same_vector(b: &mut Bencher) {
92 let vec: Vec<_> = (0..100).collect();
93 b.iter(|| vec.ends_with(&vec))
97 fn ends_with_single_element(b: &mut Bencher) {
98 let vec: Vec<_> = vec![0];
99 b.iter(|| vec.ends_with(&vec))
103 fn ends_with_diff_one_element_at_beginning(b: &mut Bencher) {
104 let vec: Vec<_> = (0..100).collect();
105 let mut match_vec: Vec<_> = (0..100).collect();
107 b.iter(|| vec.starts_with(&match_vec))
111 fn contains_last_element(b: &mut Bencher) {
112 let vec: Vec<_> = (0..100).collect();
113 b.iter(|| vec.contains(&99))
117 fn zero_1kb_from_elem(b: &mut Bencher) {
118 b.iter(|| vec![0u8; 1024]);
122 fn zero_1kb_set_memory(b: &mut Bencher) {
124 let mut v = Vec::<u8>::with_capacity(1024);
126 let vp = v.as_mut_ptr();
127 ptr::write_bytes(vp, 0, 1024);
135 fn zero_1kb_loop_set(b: &mut Bencher) {
137 let mut v = Vec::<u8>::with_capacity(1024);
148 fn zero_1kb_mut_iter(b: &mut Bencher) {
150 let mut v = Vec::<u8>::with_capacity(1024);
162 fn random_inserts(b: &mut Bencher) {
163 let mut rng = thread_rng();
165 let mut v = vec![(0, 0); 30];
168 v.insert(rng.gen::<usize>() % (l + 1), (1, 1));
173 fn random_removes(b: &mut Bencher) {
174 let mut rng = thread_rng();
176 let mut v = vec![(0, 0); 130];
179 v.remove(rng.gen::<usize>() % l);
184 fn gen_ascending(len: usize) -> Vec<u64> {
185 (0..len as u64).collect()
188 fn gen_descending(len: usize) -> Vec<u64> {
189 (0..len as u64).rev().collect()
192 fn gen_random(len: usize) -> Vec<u64> {
193 let mut rng = thread_rng();
194 rng.gen_iter::<u64>().take(len).collect()
197 fn gen_mostly_ascending(len: usize) -> Vec<u64> {
198 let mut rng = thread_rng();
199 let mut v = gen_ascending(len);
200 for _ in (0usize..).take_while(|x| x * x <= len) {
201 let x = rng.gen::<usize>() % len;
202 let y = rng.gen::<usize>() % len;
208 fn gen_mostly_descending(len: usize) -> Vec<u64> {
209 let mut rng = thread_rng();
210 let mut v = gen_descending(len);
211 for _ in (0usize..).take_while(|x| x * x <= len) {
212 let x = rng.gen::<usize>() % len;
213 let y = rng.gen::<usize>() % len;
219 fn gen_big_random(len: usize) -> Vec<[u64; 16]> {
220 let mut rng = thread_rng();
221 rng.gen_iter().map(|x| [x; 16]).take(len).collect()
224 fn gen_big_ascending(len: usize) -> Vec<[u64; 16]> {
225 (0..len as u64).map(|x| [x; 16]).take(len).collect()
228 fn gen_big_descending(len: usize) -> Vec<[u64; 16]> {
229 (0..len as u64).rev().map(|x| [x; 16]).take(len).collect()
232 macro_rules! sort_bench {
233 ($name:ident, $gen:expr, $len:expr) => {
235 fn $name(b: &mut Bencher) {
236 b.iter(|| $gen($len).sort());
237 b.bytes = $len * mem::size_of_val(&$gen(1)[0]) as u64;
242 sort_bench!(sort_small_random, gen_random, 10);
243 sort_bench!(sort_small_ascending, gen_ascending, 10);
244 sort_bench!(sort_small_descending, gen_descending, 10);
246 sort_bench!(sort_small_big_random, gen_big_random, 10);
247 sort_bench!(sort_small_big_ascending, gen_big_ascending, 10);
248 sort_bench!(sort_small_big_descending, gen_big_descending, 10);
250 sort_bench!(sort_medium_random, gen_random, 100);
251 sort_bench!(sort_medium_ascending, gen_ascending, 100);
252 sort_bench!(sort_medium_descending, gen_descending, 100);
254 sort_bench!(sort_large_random, gen_random, 10000);
255 sort_bench!(sort_large_ascending, gen_ascending, 10000);
256 sort_bench!(sort_large_descending, gen_descending, 10000);
257 sort_bench!(sort_large_mostly_ascending, gen_mostly_ascending, 10000);
258 sort_bench!(sort_large_mostly_descending, gen_mostly_descending, 10000);
260 sort_bench!(sort_large_big_random, gen_big_random, 10000);
261 sort_bench!(sort_large_big_ascending, gen_big_ascending, 10000);
262 sort_bench!(sort_large_big_descending, gen_big_descending, 10000);
265 fn sort_large_random_expensive(b: &mut Bencher) {
268 let mut v = gen_random(len);
270 v.sort_by(|a: &u64, b: &u64| {
272 if count % 1_000_000_000 == 0 {
273 panic!("should not happen");
275 (*a as f64).cos().partial_cmp(&(*b as f64).cos()).unwrap()
279 b.bytes = len as u64 * mem::size_of::<u64>() as u64;