]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | #![feature(test)] |
2 | ||
3 | extern crate test; | |
4 | extern crate itertools; | |
5 | ||
6 | use itertools::Itertools; | |
7 | ||
8 | struct Unspecialized<I>(I); | |
9 | ||
10 | impl<I> Iterator for Unspecialized<I> | |
11 | where I: Iterator | |
12 | { | |
13 | type Item = I::Item; | |
14 | ||
15 | #[inline(always)] | |
16 | fn next(&mut self) -> Option<I::Item> { | |
17 | self.0.next() | |
18 | } | |
19 | ||
20 | #[inline(always)] | |
21 | fn size_hint(&self) -> (usize, Option<usize>) { | |
22 | self.0.size_hint() | |
23 | } | |
24 | } | |
25 | ||
26 | mod specialization { | |
27 | use super::*; | |
28 | ||
29 | mod intersperse { | |
30 | use super::*; | |
31 | ||
32 | #[bench] | |
33 | fn external(b: &mut test::Bencher) | |
34 | { | |
35 | let arr = [1; 1024]; | |
36 | ||
37 | b.iter(|| { | |
38 | let mut sum = 0; | |
39 | for &x in arr.into_iter().intersperse(&0) { | |
40 | sum += x; | |
41 | } | |
42 | sum | |
43 | }) | |
44 | } | |
45 | ||
46 | #[bench] | |
47 | fn internal_specialized(b: &mut test::Bencher) | |
48 | { | |
49 | let arr = [1; 1024]; | |
50 | ||
51 | b.iter(|| { | |
52 | arr.into_iter().intersperse(&0).fold(0, |acc, x| acc + x) | |
53 | }) | |
54 | } | |
55 | ||
56 | #[bench] | |
57 | fn internal_unspecialized(b: &mut test::Bencher) | |
58 | { | |
59 | let arr = [1; 1024]; | |
60 | ||
61 | b.iter(|| { | |
62 | Unspecialized(arr.into_iter().intersperse(&0)).fold(0, |acc, x| acc + x) | |
63 | }) | |
64 | } | |
65 | } | |
66 | } |