1 use std::iter::{repeat, FromIterator};
2 use test::{black_box, Bencher};
5 fn bench_new(b: &mut Bencher) {
7 let v: Vec<u32> = Vec::new();
8 assert_eq!(v.len(), 0);
9 assert_eq!(v.capacity(), 0);
14 fn do_bench_with_capacity(b: &mut Bencher, src_len: usize) {
15 b.bytes = src_len as u64;
18 let v: Vec<u32> = Vec::with_capacity(src_len);
19 assert_eq!(v.len(), 0);
20 assert_eq!(v.capacity(), src_len);
26 fn bench_with_capacity_0000(b: &mut Bencher) {
27 do_bench_with_capacity(b, 0)
31 fn bench_with_capacity_0010(b: &mut Bencher) {
32 do_bench_with_capacity(b, 10)
36 fn bench_with_capacity_0100(b: &mut Bencher) {
37 do_bench_with_capacity(b, 100)
41 fn bench_with_capacity_1000(b: &mut Bencher) {
42 do_bench_with_capacity(b, 1000)
45 fn do_bench_from_fn(b: &mut Bencher, src_len: usize) {
46 b.bytes = src_len as u64;
49 let dst = (0..src_len).collect::<Vec<_>>();
50 assert_eq!(dst.len(), src_len);
51 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
57 fn bench_from_fn_0000(b: &mut Bencher) {
58 do_bench_from_fn(b, 0)
62 fn bench_from_fn_0010(b: &mut Bencher) {
63 do_bench_from_fn(b, 10)
67 fn bench_from_fn_0100(b: &mut Bencher) {
68 do_bench_from_fn(b, 100)
72 fn bench_from_fn_1000(b: &mut Bencher) {
73 do_bench_from_fn(b, 1000)
76 fn do_bench_from_elem(b: &mut Bencher, src_len: usize) {
77 b.bytes = src_len as u64;
80 let dst: Vec<usize> = repeat(5).take(src_len).collect();
81 assert_eq!(dst.len(), src_len);
82 assert!(dst.iter().all(|x| *x == 5));
88 fn bench_from_elem_0000(b: &mut Bencher) {
89 do_bench_from_elem(b, 0)
93 fn bench_from_elem_0010(b: &mut Bencher) {
94 do_bench_from_elem(b, 10)
98 fn bench_from_elem_0100(b: &mut Bencher) {
99 do_bench_from_elem(b, 100)
103 fn bench_from_elem_1000(b: &mut Bencher) {
104 do_bench_from_elem(b, 1000)
107 fn do_bench_from_slice(b: &mut Bencher, src_len: usize) {
108 let src: Vec<_> = FromIterator::from_iter(0..src_len);
110 b.bytes = src_len as u64;
113 let dst = src.clone()[..].to_vec();
114 assert_eq!(dst.len(), src_len);
115 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
121 fn bench_from_slice_0000(b: &mut Bencher) {
122 do_bench_from_slice(b, 0)
126 fn bench_from_slice_0010(b: &mut Bencher) {
127 do_bench_from_slice(b, 10)
131 fn bench_from_slice_0100(b: &mut Bencher) {
132 do_bench_from_slice(b, 100)
136 fn bench_from_slice_1000(b: &mut Bencher) {
137 do_bench_from_slice(b, 1000)
140 fn do_bench_from_iter(b: &mut Bencher, src_len: usize) {
141 let src: Vec<_> = FromIterator::from_iter(0..src_len);
143 b.bytes = src_len as u64;
146 let dst: Vec<_> = FromIterator::from_iter(src.clone());
147 assert_eq!(dst.len(), src_len);
148 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
154 fn bench_from_iter_0000(b: &mut Bencher) {
155 do_bench_from_iter(b, 0)
159 fn bench_from_iter_0010(b: &mut Bencher) {
160 do_bench_from_iter(b, 10)
164 fn bench_from_iter_0100(b: &mut Bencher) {
165 do_bench_from_iter(b, 100)
169 fn bench_from_iter_1000(b: &mut Bencher) {
170 do_bench_from_iter(b, 1000)
173 fn do_bench_extend(b: &mut Bencher, dst_len: usize, src_len: usize) {
174 let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
175 let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
177 b.bytes = src_len as u64;
180 let mut dst = dst.clone();
181 dst.extend(src.clone());
182 assert_eq!(dst.len(), dst_len + src_len);
183 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
189 fn bench_extend_0000_0000(b: &mut Bencher) {
190 do_bench_extend(b, 0, 0)
194 fn bench_extend_0000_0010(b: &mut Bencher) {
195 do_bench_extend(b, 0, 10)
199 fn bench_extend_0000_0100(b: &mut Bencher) {
200 do_bench_extend(b, 0, 100)
204 fn bench_extend_0000_1000(b: &mut Bencher) {
205 do_bench_extend(b, 0, 1000)
209 fn bench_extend_0010_0010(b: &mut Bencher) {
210 do_bench_extend(b, 10, 10)
214 fn bench_extend_0100_0100(b: &mut Bencher) {
215 do_bench_extend(b, 100, 100)
219 fn bench_extend_1000_1000(b: &mut Bencher) {
220 do_bench_extend(b, 1000, 1000)
223 fn do_bench_extend_from_slice(b: &mut Bencher, dst_len: usize, src_len: usize) {
224 let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
225 let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
227 b.bytes = src_len as u64;
230 let mut dst = dst.clone();
231 dst.extend_from_slice(&src);
232 assert_eq!(dst.len(), dst_len + src_len);
233 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
239 fn bench_extend_from_slice_0000_0000(b: &mut Bencher) {
240 do_bench_extend_from_slice(b, 0, 0)
244 fn bench_extend_from_slice_0000_0010(b: &mut Bencher) {
245 do_bench_extend_from_slice(b, 0, 10)
249 fn bench_extend_from_slice_0000_0100(b: &mut Bencher) {
250 do_bench_extend_from_slice(b, 0, 100)
254 fn bench_extend_from_slice_0000_1000(b: &mut Bencher) {
255 do_bench_extend_from_slice(b, 0, 1000)
259 fn bench_extend_from_slice_0010_0010(b: &mut Bencher) {
260 do_bench_extend_from_slice(b, 10, 10)
264 fn bench_extend_from_slice_0100_0100(b: &mut Bencher) {
265 do_bench_extend_from_slice(b, 100, 100)
269 fn bench_extend_from_slice_1000_1000(b: &mut Bencher) {
270 do_bench_extend_from_slice(b, 1000, 1000)
273 fn do_bench_clone(b: &mut Bencher, src_len: usize) {
274 let src: Vec<usize> = FromIterator::from_iter(0..src_len);
276 b.bytes = src_len as u64;
279 let dst = src.clone();
280 assert_eq!(dst.len(), src_len);
281 assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
287 fn bench_clone_0000(b: &mut Bencher) {
292 fn bench_clone_0010(b: &mut Bencher) {
293 do_bench_clone(b, 10)
297 fn bench_clone_0100(b: &mut Bencher) {
298 do_bench_clone(b, 100)
302 fn bench_clone_1000(b: &mut Bencher) {
303 do_bench_clone(b, 1000)
306 fn do_bench_clone_from(b: &mut Bencher, times: usize, dst_len: usize, src_len: usize) {
307 let dst: Vec<_> = FromIterator::from_iter(0..src_len);
308 let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
310 b.bytes = (times * src_len) as u64;
313 let mut dst = dst.clone();
316 dst.clone_from(&src);
317 assert_eq!(dst.len(), src_len);
318 assert!(dst.iter().enumerate().all(|(i, x)| dst_len + i == *x));
325 fn bench_clone_from_01_0000_0000(b: &mut Bencher) {
326 do_bench_clone_from(b, 1, 0, 0)
330 fn bench_clone_from_01_0000_0010(b: &mut Bencher) {
331 do_bench_clone_from(b, 1, 0, 10)
335 fn bench_clone_from_01_0000_0100(b: &mut Bencher) {
336 do_bench_clone_from(b, 1, 0, 100)
340 fn bench_clone_from_01_0000_1000(b: &mut Bencher) {
341 do_bench_clone_from(b, 1, 0, 1000)
345 fn bench_clone_from_01_0010_0010(b: &mut Bencher) {
346 do_bench_clone_from(b, 1, 10, 10)
350 fn bench_clone_from_01_0100_0100(b: &mut Bencher) {
351 do_bench_clone_from(b, 1, 100, 100)
355 fn bench_clone_from_01_1000_1000(b: &mut Bencher) {
356 do_bench_clone_from(b, 1, 1000, 1000)
360 fn bench_clone_from_01_0010_0100(b: &mut Bencher) {
361 do_bench_clone_from(b, 1, 10, 100)
365 fn bench_clone_from_01_0100_1000(b: &mut Bencher) {
366 do_bench_clone_from(b, 1, 100, 1000)
370 fn bench_clone_from_01_0010_0000(b: &mut Bencher) {
371 do_bench_clone_from(b, 1, 10, 0)
375 fn bench_clone_from_01_0100_0010(b: &mut Bencher) {
376 do_bench_clone_from(b, 1, 100, 10)
380 fn bench_clone_from_01_1000_0100(b: &mut Bencher) {
381 do_bench_clone_from(b, 1, 1000, 100)
385 fn bench_clone_from_10_0000_0000(b: &mut Bencher) {
386 do_bench_clone_from(b, 10, 0, 0)
390 fn bench_clone_from_10_0000_0010(b: &mut Bencher) {
391 do_bench_clone_from(b, 10, 0, 10)
395 fn bench_clone_from_10_0000_0100(b: &mut Bencher) {
396 do_bench_clone_from(b, 10, 0, 100)
400 fn bench_clone_from_10_0000_1000(b: &mut Bencher) {
401 do_bench_clone_from(b, 10, 0, 1000)
405 fn bench_clone_from_10_0010_0010(b: &mut Bencher) {
406 do_bench_clone_from(b, 10, 10, 10)
410 fn bench_clone_from_10_0100_0100(b: &mut Bencher) {
411 do_bench_clone_from(b, 10, 100, 100)
415 fn bench_clone_from_10_1000_1000(b: &mut Bencher) {
416 do_bench_clone_from(b, 10, 1000, 1000)
420 fn bench_clone_from_10_0010_0100(b: &mut Bencher) {
421 do_bench_clone_from(b, 10, 10, 100)
425 fn bench_clone_from_10_0100_1000(b: &mut Bencher) {
426 do_bench_clone_from(b, 10, 100, 1000)
430 fn bench_clone_from_10_0010_0000(b: &mut Bencher) {
431 do_bench_clone_from(b, 10, 10, 0)
435 fn bench_clone_from_10_0100_0010(b: &mut Bencher) {
436 do_bench_clone_from(b, 10, 100, 10)
440 fn bench_clone_from_10_1000_0100(b: &mut Bencher) {
441 do_bench_clone_from(b, 10, 1000, 100)
444 macro_rules! bench_in_place {
446 $($fname:ident, $type:ty , $count:expr, $init: expr);*
450 fn $fname(b: &mut Bencher) {
452 let src: Vec<$type> = black_box(vec![$init; $count]);
453 let mut sink = src.into_iter()
455 .map(|(idx, e)| { (idx as $type) ^ e }).collect::<Vec<$type>>();
456 black_box(sink.as_mut_ptr())
464 bench_in_place_xxu8_i0_0010, u8, 10, 0;
465 bench_in_place_xxu8_i0_0100, u8, 100, 0;
466 bench_in_place_xxu8_i0_1000, u8, 1000, 0;
467 bench_in_place_xxu8_i1_0010, u8, 10, 1;
468 bench_in_place_xxu8_i1_0100, u8, 100, 1;
469 bench_in_place_xxu8_i1_1000, u8, 1000, 1;
470 bench_in_place_xu32_i0_0010, u32, 10, 0;
471 bench_in_place_xu32_i0_0100, u32, 100, 0;
472 bench_in_place_xu32_i0_1000, u32, 1000, 0;
473 bench_in_place_xu32_i1_0010, u32, 10, 1;
474 bench_in_place_xu32_i1_0100, u32, 100, 1;
475 bench_in_place_xu32_i1_1000, u32, 1000, 1;
476 bench_in_place_u128_i0_0010, u128, 10, 0;
477 bench_in_place_u128_i0_0100, u128, 100, 0;
478 bench_in_place_u128_i0_1000, u128, 1000, 0;
479 bench_in_place_u128_i1_0010, u128, 10, 1;
480 bench_in_place_u128_i1_0100, u128, 100, 1;
481 bench_in_place_u128_i1_1000, u128, 1000, 1
485 fn bench_in_place_recycle(b: &mut test::Bencher) {
486 let mut data = vec![0; 1000];
489 let tmp = std::mem::replace(&mut data, Vec::new());
495 .map(|(idx, e)| idx.wrapping_add(e))
498 .collect::<Vec<usize>>(),
505 struct Droppable(usize);
507 impl Drop for Droppable {
514 fn bench_in_place_collect_droppable(b: &mut test::Bencher) {
515 let v: Vec<Droppable> = std::iter::repeat_with(|| Droppable(0)).take(1000).collect();
516 b.iter(|| v.clone().into_iter().skip(100).collect::<Vec<_>>())
520 fn bench_chain_collect(b: &mut test::Bencher) {
521 let data = black_box([0; LEN]);
522 b.iter(|| data.iter().cloned().chain([1].iter().cloned()).collect::<Vec<_>>());
526 fn bench_chain_chain_collect(b: &mut test::Bencher) {
527 let data = black_box([0; LEN]);
531 .chain([1].iter().cloned())
532 .chain([2].iter().cloned())
538 fn bench_nest_chain_chain_collect(b: &mut test::Bencher) {
539 let data = black_box([0; LEN]);
541 data.iter().cloned().chain([1].iter().chain([2].iter()).cloned()).collect::<Vec<_>>()
545 pub fn example_plain_slow(l: &[u32]) -> Vec<u32> {
546 let mut result = Vec::with_capacity(l.len());
547 result.extend(l.iter().rev());
551 pub fn map_fast(l: &[(u32, u32)]) -> Vec<u32> {
552 let mut result = Vec::with_capacity(l.len());
553 for i in 0..l.len() {
555 *result.get_unchecked_mut(i) = l[i].0;
562 const LEN: usize = 16384;
565 fn bench_range_map_collect(b: &mut test::Bencher) {
566 b.iter(|| (0..LEN).map(|_| u32::default()).collect::<Vec<_>>());
570 fn bench_chain_extend_ref(b: &mut test::Bencher) {
571 let data = black_box([0; LEN]);
573 let mut v = Vec::<u32>::with_capacity(data.len() + 1);
574 v.extend(data.iter().chain([1].iter()));
580 fn bench_chain_extend_value(b: &mut test::Bencher) {
581 let data = black_box([0; LEN]);
583 let mut v = Vec::<u32>::with_capacity(data.len() + 1);
584 v.extend(data.iter().cloned().chain(Some(1)));
590 fn bench_rev_1(b: &mut test::Bencher) {
591 let data = black_box([0; LEN]);
593 let mut v = Vec::<u32>::new();
594 v.extend(data.iter().rev());
600 fn bench_rev_2(b: &mut test::Bencher) {
601 let data = black_box([0; LEN]);
603 example_plain_slow(&data);
608 fn bench_map_regular(b: &mut test::Bencher) {
609 let data = black_box([(0, 0); LEN]);
611 let mut v = Vec::<u32>::new();
612 v.extend(data.iter().map(|t| t.1));
618 fn bench_map_fast(b: &mut test::Bencher) {
619 let data = black_box([(0, 0); LEN]);
620 b.iter(|| map_fast(&data));