tuples.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. use criterion::{criterion_group, criterion_main, Criterion};
  2. use itertools::Itertools;
  3. fn s1(a: u32) -> u32 {
  4. a
  5. }
  6. fn s2(a: u32, b: u32) -> u32 {
  7. a + b
  8. }
  9. fn s3(a: u32, b: u32, c: u32) -> u32 {
  10. a + b + c
  11. }
  12. fn s4(a: u32, b: u32, c: u32, d: u32) -> u32 {
  13. a + b + c + d
  14. }
  15. fn sum_s1(s: &[u32]) -> u32 {
  16. s1(s[0])
  17. }
  18. fn sum_s2(s: &[u32]) -> u32 {
  19. s2(s[0], s[1])
  20. }
  21. fn sum_s3(s: &[u32]) -> u32 {
  22. s3(s[0], s[1], s[2])
  23. }
  24. fn sum_s4(s: &[u32]) -> u32 {
  25. s4(s[0], s[1], s[2], s[3])
  26. }
  27. fn sum_t1(s: &(&u32, )) -> u32 {
  28. s1(*s.0)
  29. }
  30. fn sum_t2(s: &(&u32, &u32)) -> u32 {
  31. s2(*s.0, *s.1)
  32. }
  33. fn sum_t3(s: &(&u32, &u32, &u32)) -> u32 {
  34. s3(*s.0, *s.1, *s.2)
  35. }
  36. fn sum_t4(s: &(&u32, &u32, &u32, &u32)) -> u32 {
  37. s4(*s.0, *s.1, *s.2, *s.3)
  38. }
  39. macro_rules! def_benchs {
  40. ($N:expr;
  41. $BENCH_GROUP:ident,
  42. $TUPLE_FUN:ident,
  43. $TUPLES:ident,
  44. $TUPLE_WINDOWS:ident;
  45. $SLICE_FUN:ident,
  46. $CHUNKS:ident,
  47. $WINDOWS:ident;
  48. $FOR_CHUNKS:ident,
  49. $FOR_WINDOWS:ident
  50. ) => (
  51. fn $FOR_CHUNKS(c: &mut Criterion) {
  52. let v: Vec<u32> = (0.. $N * 1_000).collect();
  53. let mut s = 0;
  54. c.bench_function(&stringify!($FOR_CHUNKS).replace('_', " "), move |b| {
  55. b.iter(|| {
  56. let mut j = 0;
  57. for _ in 0..1_000 {
  58. s += $SLICE_FUN(&v[j..(j + $N)]);
  59. j += $N;
  60. }
  61. s
  62. })
  63. });
  64. }
  65. fn $FOR_WINDOWS(c: &mut Criterion) {
  66. let v: Vec<u32> = (0..1_000).collect();
  67. let mut s = 0;
  68. c.bench_function(&stringify!($FOR_WINDOWS).replace('_', " "), move |b| {
  69. b.iter(|| {
  70. for i in 0..(1_000 - $N) {
  71. s += $SLICE_FUN(&v[i..(i + $N)]);
  72. }
  73. s
  74. })
  75. });
  76. }
  77. fn $TUPLES(c: &mut Criterion) {
  78. let v: Vec<u32> = (0.. $N * 1_000).collect();
  79. let mut s = 0;
  80. c.bench_function(&stringify!($TUPLES).replace('_', " "), move |b| {
  81. b.iter(|| {
  82. for x in v.iter().tuples() {
  83. s += $TUPLE_FUN(&x);
  84. }
  85. s
  86. })
  87. });
  88. }
  89. fn $CHUNKS(c: &mut Criterion) {
  90. let v: Vec<u32> = (0.. $N * 1_000).collect();
  91. let mut s = 0;
  92. c.bench_function(&stringify!($CHUNKS).replace('_', " "), move |b| {
  93. b.iter(|| {
  94. for x in v.chunks($N) {
  95. s += $SLICE_FUN(x);
  96. }
  97. s
  98. })
  99. });
  100. }
  101. fn $TUPLE_WINDOWS(c: &mut Criterion) {
  102. let v: Vec<u32> = (0..1_000).collect();
  103. let mut s = 0;
  104. c.bench_function(&stringify!($TUPLE_WINDOWS).replace('_', " "), move |b| {
  105. b.iter(|| {
  106. for x in v.iter().tuple_windows() {
  107. s += $TUPLE_FUN(&x);
  108. }
  109. s
  110. })
  111. });
  112. }
  113. fn $WINDOWS(c: &mut Criterion) {
  114. let v: Vec<u32> = (0..1_000).collect();
  115. let mut s = 0;
  116. c.bench_function(&stringify!($WINDOWS).replace('_', " "), move |b| {
  117. b.iter(|| {
  118. for x in v.windows($N) {
  119. s += $SLICE_FUN(x);
  120. }
  121. s
  122. })
  123. });
  124. }
  125. criterion_group!(
  126. $BENCH_GROUP,
  127. $FOR_CHUNKS,
  128. $FOR_WINDOWS,
  129. $TUPLES,
  130. $CHUNKS,
  131. $TUPLE_WINDOWS,
  132. $WINDOWS,
  133. );
  134. )
  135. }
  136. def_benchs!{
  137. 1;
  138. benches_1,
  139. sum_t1,
  140. tuple_chunks_1,
  141. tuple_windows_1;
  142. sum_s1,
  143. slice_chunks_1,
  144. slice_windows_1;
  145. for_chunks_1,
  146. for_windows_1
  147. }
  148. def_benchs!{
  149. 2;
  150. benches_2,
  151. sum_t2,
  152. tuple_chunks_2,
  153. tuple_windows_2;
  154. sum_s2,
  155. slice_chunks_2,
  156. slice_windows_2;
  157. for_chunks_2,
  158. for_windows_2
  159. }
  160. def_benchs!{
  161. 3;
  162. benches_3,
  163. sum_t3,
  164. tuple_chunks_3,
  165. tuple_windows_3;
  166. sum_s3,
  167. slice_chunks_3,
  168. slice_windows_3;
  169. for_chunks_3,
  170. for_windows_3
  171. }
  172. def_benchs!{
  173. 4;
  174. benches_4,
  175. sum_t4,
  176. tuple_chunks_4,
  177. tuple_windows_4;
  178. sum_s4,
  179. slice_chunks_4,
  180. slice_windows_4;
  181. for_chunks_4,
  182. for_windows_4
  183. }
  184. criterion_main!(
  185. benches_1,
  186. benches_2,
  187. benches_3,
  188. benches_4,
  189. );