Skip to content

Commit 9fc2af3

Browse files
New specialization benchmarks
I do not want to add them one by one in future pull requests so this is (mostly) done!
1 parent cdf12df commit 9fc2af3

File tree

1 file changed

+351
-0
lines changed

1 file changed

+351
-0
lines changed

benches/specializations.rs

Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(unstable_name_collisions)]
2+
13
use criterion::black_box;
24
use itertools::iproduct;
35
use itertools::Itertools;
@@ -24,6 +26,7 @@ macro_rules! bench_specializations {
2426
)*
2527
) => {
2628
$(
29+
#[allow(unused_must_use)]
2730
fn $name(c: &mut ::criterion::Criterion) {
2831
let mut bench_group = c.benchmark_group(stringify!($name));
2932
$(
@@ -132,6 +135,59 @@ macro_rules! bench_specializations {
132135
// Example: To bench only `ZipLongest::fold`, you can do
133136
// cargo bench --bench specializations zip_longest/fold
134137
bench_specializations! {
138+
interleave {
139+
{
140+
let v1 = black_box(vec![0; 1024]);
141+
let v2 = black_box(vec![0; 768]);
142+
}
143+
v1.iter().interleave(&v2)
144+
}
145+
interleave_shortest {
146+
{
147+
let v1 = black_box(vec![0; 1024]);
148+
let v2 = black_box(vec![0; 768]);
149+
}
150+
v1.iter().interleave_shortest(&v2)
151+
}
152+
batching {
153+
{
154+
let v = black_box(vec![0; 1024]);
155+
}
156+
v.iter().batching(Iterator::next)
157+
}
158+
tuple_windows {
159+
ExactSizeIterator
160+
{
161+
let v = black_box(vec![0; 1024]);
162+
}
163+
v.iter().tuple_windows::<(_, _, _, _)>()
164+
}
165+
circular_tuple_windows {
166+
ExactSizeIterator
167+
{
168+
let v = black_box(vec![0; 1024]);
169+
}
170+
v.iter().circular_tuple_windows::<(_, _, _, _)>()
171+
}
172+
tuples {
173+
ExactSizeIterator
174+
{
175+
let v = black_box(vec![0; 1024]);
176+
}
177+
v.iter().tuples::<(_, _, _, _)>()
178+
}
179+
tuple_buffer {
180+
ExactSizeIterator
181+
{
182+
let v = black_box(vec![0; 11]);
183+
// Short but the buffer can't have 12 or more elements.
184+
}
185+
{
186+
let mut it = v.iter().tuples::<(_, _, _, _, _, _, _, _, _, _, _, _)>();
187+
it.next(); // No element but it fills the buffer.
188+
it.into_buffer()
189+
}
190+
}
135191
cartesian_product {
136192
{
137193
let v = black_box(vec![0; 16]);
@@ -144,12 +200,137 @@ bench_specializations! {
144200
}
145201
vs.iter().multi_cartesian_product()
146202
}
203+
coalesce {
204+
{
205+
let v = black_box(vec![0; 1024]);
206+
}
207+
v.iter().coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) })
208+
}
209+
dedup {
210+
{
211+
let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec());
212+
}
213+
v.iter().dedup()
214+
}
215+
dedup_by {
216+
{
217+
let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec());
218+
}
219+
v.iter().dedup_by(PartialOrd::ge)
220+
}
221+
dedup_with_count {
222+
{
223+
let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec());
224+
}
225+
v.iter().dedup_with_count()
226+
}
227+
dedup_by_with_count {
228+
{
229+
let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec());
230+
}
231+
v.iter().dedup_by_with_count(PartialOrd::ge)
232+
}
233+
duplicates {
234+
DoubleEndedIterator
235+
{
236+
let v = black_box((0..32).cycle().take(1024).collect_vec());
237+
}
238+
v.iter().duplicates()
239+
}
240+
duplicates_by {
241+
DoubleEndedIterator
242+
{
243+
let v = black_box((0..1024).collect_vec());
244+
}
245+
v.iter().duplicates_by(|x| *x % 10)
246+
}
247+
unique {
248+
DoubleEndedIterator
249+
{
250+
let v = black_box((0..32).cycle().take(1024).collect_vec());
251+
}
252+
v.iter().unique()
253+
}
254+
unique_by {
255+
DoubleEndedIterator
256+
{
257+
let v = black_box((0..1024).collect_vec());
258+
}
259+
v.iter().unique_by(|x| *x % 50)
260+
}
261+
take_while_inclusive {
262+
{
263+
let v = black_box((0..1024).collect_vec());
264+
}
265+
v.iter().take_while_inclusive(|x| **x < 1000)
266+
}
267+
pad_using {
268+
DoubleEndedIterator
269+
ExactSizeIterator
270+
{
271+
let v = black_box((0..1024).collect_vec());
272+
}
273+
v.iter().copied().pad_using(2048, |i| 5 * i)
274+
}
275+
positions {
276+
DoubleEndedIterator
277+
{
278+
let v = black_box((0..1024).collect_vec());
279+
}
280+
v.iter().positions(|x| x % 5 == 0)
281+
}
282+
update {
283+
DoubleEndedIterator
284+
ExactSizeIterator
285+
{
286+
let v = black_box((0_i32..1024).collect_vec());
287+
}
288+
v.iter().copied().update(|x| *x *= 7)
289+
}
147290
tuple_combinations {
148291
{
149292
let v = black_box((0..64).collect_vec());
150293
}
151294
v.iter().tuple_combinations::<(_, _, _, _)>()
152295
}
296+
intersperse {
297+
{
298+
let v = black_box(vec![0; 1024]);
299+
let n = black_box(0);
300+
}
301+
v.iter().intersperse(&n)
302+
}
303+
intersperse_with {
304+
{
305+
let v = black_box(vec![0; 1024]);
306+
let n = black_box(0);
307+
}
308+
v.iter().intersperse_with(|| &n)
309+
}
310+
combinations {
311+
{
312+
let v = black_box(vec![0; 16]);
313+
}
314+
v.iter().combinations(4)
315+
}
316+
combinations_with_replacement {
317+
{
318+
let v = black_box(vec![0; 16]);
319+
}
320+
v.iter().combinations_with_replacement(4)
321+
}
322+
permutations {
323+
{
324+
let v = black_box(vec![0; 8]);
325+
}
326+
v.iter().permutations(4)
327+
}
328+
powerset {
329+
{
330+
let v = black_box(vec![0; 10]);
331+
}
332+
v.iter().powerset()
333+
}
153334
while_some {
154335
{}
155336
(0..)
@@ -173,4 +354,174 @@ bench_specializations! {
173354
}
174355
xs.iter().zip_longest(ys.iter())
175356
}
357+
zip_eq {
358+
ExactSizeIterator
359+
{
360+
let v = black_box(vec![0; 1024]);
361+
}
362+
v.iter().zip_eq(v.iter().rev())
363+
}
364+
multizip {
365+
DoubleEndedIterator
366+
ExactSizeIterator
367+
{
368+
let v1 = black_box(vec![0; 1024]);
369+
let v2 = black_box(vec![0; 768]);
370+
let v3 = black_box(vec![0; 2048]);
371+
}
372+
itertools::multizip((&v1, &v2, &v3))
373+
}
374+
izip {
375+
DoubleEndedIterator
376+
ExactSizeIterator
377+
{
378+
let v1 = black_box(vec![0; 1024]);
379+
let v2 = black_box(vec![0; 768]);
380+
let v3 = black_box(vec![0; 2048]);
381+
}
382+
itertools::izip!(&v1, &v2, &v3)
383+
}
384+
put_back {
385+
{
386+
let v = black_box(vec![0; 1024]);
387+
}
388+
itertools::put_back(&v).with_value(black_box(&0))
389+
}
390+
put_back_n {
391+
{
392+
let v1 = black_box(vec![0; 1024]);
393+
let v2 = black_box(vec![0; 16]);
394+
}
395+
{
396+
let mut it = itertools::put_back_n(&v1);
397+
for n in &v2 {
398+
it.put_back(n);
399+
}
400+
it
401+
}
402+
}
403+
exactly_one_error {
404+
ExactSizeIterator
405+
{
406+
let v = black_box(vec![0; 1024]);
407+
}
408+
// Use `at_most_one` would be similar.
409+
v.iter().exactly_one().unwrap_err()
410+
}
411+
multipeek {
412+
ExactSizeIterator
413+
{
414+
let v = black_box(vec![0; 1024]);
415+
let n = black_box(16);
416+
}
417+
{
418+
let mut it = v.iter().multipeek();
419+
for _ in 0..n {
420+
it.peek();
421+
}
422+
it
423+
}
424+
}
425+
peek_nth {
426+
ExactSizeIterator
427+
{
428+
let v = black_box(vec![0; 1024]);
429+
let n = black_box(16);
430+
}
431+
{
432+
let mut it = itertools::peek_nth(&v);
433+
it.peek_nth(n);
434+
it
435+
}
436+
}
437+
repeat_n {
438+
DoubleEndedIterator
439+
ExactSizeIterator
440+
{}
441+
itertools::repeat_n(black_box(0), black_box(1024))
442+
}
443+
merge {
444+
{
445+
let v1 = black_box(vec![0; 1024]);
446+
let v2 = black_box(vec![0; 768]);
447+
}
448+
v1.iter().merge(&v2)
449+
}
450+
merge_by {
451+
{
452+
let v1 = black_box(vec![0; 1024]);
453+
let v2 = black_box(vec![0; 768]);
454+
}
455+
v1.iter().merge_by(&v2, PartialOrd::ge)
456+
}
457+
merge_join_by_ordering {
458+
{
459+
let v1 = black_box(vec![0; 1024]);
460+
let v2 = black_box(vec![0; 768]);
461+
}
462+
v1.iter().merge_join_by(&v2, Ord::cmp)
463+
}
464+
merge_join_by_bool {
465+
{
466+
let v1 = black_box(vec![0; 1024]);
467+
let v2 = black_box(vec![0; 768]);
468+
}
469+
v1.iter().merge_join_by(&v2, PartialOrd::ge)
470+
}
471+
kmerge {
472+
{
473+
let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]);
474+
}
475+
vs.iter().kmerge()
476+
}
477+
kmerge_by {
478+
{
479+
let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]);
480+
}
481+
vs.iter().kmerge_by(PartialOrd::ge)
482+
}
483+
map_into {
484+
DoubleEndedIterator
485+
ExactSizeIterator
486+
{
487+
let v = black_box(vec![0_u8; 1024]);
488+
}
489+
v.iter().copied().map_into::<u32>()
490+
}
491+
map_ok {
492+
DoubleEndedIterator
493+
ExactSizeIterator
494+
{
495+
let v = black_box((0_u32..1024)
496+
.map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })
497+
.collect_vec());
498+
}
499+
v.iter().copied().map_ok(|x| x + 1)
500+
}
501+
filter_ok {
502+
{
503+
let v = black_box((0_u32..1024)
504+
.map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })
505+
.collect_vec());
506+
}
507+
v.iter().copied().filter_ok(|x| x % 3 == 0)
508+
}
509+
filter_map_ok {
510+
{
511+
let v = black_box((0_u32..1024)
512+
.map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })
513+
.collect_vec());
514+
}
515+
v.iter().copied().filter_map_ok(|x| if x % 3 == 0 { Some(x + 1) } else { None })
516+
}
517+
flatten_ok {
518+
DoubleEndedIterator
519+
{
520+
let d = black_box(vec![0; 8]);
521+
let v = black_box((0..512)
522+
.map(|x| if x % 2 == 0 { Ok(&d) } else { Err(x) })
523+
.collect_vec());
524+
}
525+
v.iter().copied().flatten_ok()
526+
}
176527
}

0 commit comments

Comments
 (0)