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