1 #![allow(unstable_name_collisions)]
2 
3 use criterion::{criterion_group, criterion_main, Criterion};
4 use itertools::Itertools;
5 
6 struct Unspecialized<I>(I);
7 
8 impl<I> Iterator for Unspecialized<I>
9 where
10     I: Iterator,
11 {
12     type Item = I::Item;
13 
14     #[inline(always)]
next(&mut self) -> Option<Self::Item>15     fn next(&mut self) -> Option<Self::Item> {
16         self.0.next()
17     }
18 
19     #[inline(always)]
size_hint(&self) -> (usize, Option<usize>)20     fn size_hint(&self) -> (usize, Option<usize>) {
21         self.0.size_hint()
22     }
23 }
24 
25 mod specialization {
26     use super::*;
27 
28     pub mod intersperse {
29         use super::*;
30 
external(c: &mut Criterion)31         pub fn external(c: &mut Criterion) {
32             let arr = [1; 1024];
33 
34             c.bench_function("external", move |b| {
35                 b.iter(|| {
36                     let mut sum = 0;
37                     for &x in arr.iter().intersperse(&0) {
38                         sum += x;
39                     }
40                     sum
41                 })
42             });
43         }
44 
internal_specialized(c: &mut Criterion)45         pub fn internal_specialized(c: &mut Criterion) {
46             let arr = [1; 1024];
47 
48             c.bench_function("internal specialized", move |b| {
49                 b.iter(|| {
50                     #[allow(clippy::unnecessary_fold)]
51                     arr.iter().intersperse(&0).fold(0, |acc, x| acc + x)
52                 })
53             });
54         }
55 
internal_unspecialized(c: &mut Criterion)56         pub fn internal_unspecialized(c: &mut Criterion) {
57             let arr = [1; 1024];
58 
59             c.bench_function("internal unspecialized", move |b| {
60                 b.iter(|| {
61                     #[allow(clippy::unnecessary_fold)]
62                     Unspecialized(arr.iter().intersperse(&0)).fold(0, |acc, x| acc + x)
63                 })
64             });
65         }
66     }
67 }
68 
69 criterion_group!(
70     benches,
71     specialization::intersperse::external,
72     specialization::intersperse::internal_specialized,
73     specialization::intersperse::internal_unspecialized,
74 );
75 criterion_main!(benches);
76