fold_specialization.rs 1.7 KB

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