1
+ #![ allow( unstable_name_collisions) ]
2
+
1
3
use criterion:: black_box;
2
4
use itertools:: iproduct;
3
5
use itertools:: Itertools ;
@@ -24,6 +26,7 @@ macro_rules! bench_specializations {
24
26
) *
25
27
) => {
26
28
$(
29
+ #[ allow( unused_must_use) ]
27
30
fn $name( c: & mut :: criterion:: Criterion ) {
28
31
let mut bench_group = c. benchmark_group( stringify!( $name) ) ;
29
32
$(
@@ -132,6 +135,59 @@ macro_rules! bench_specializations {
132
135
// Example: To bench only `ZipLongest::fold`, you can do
133
136
// cargo bench --bench specializations zip_longest/fold
134
137
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
+ }
135
191
cartesian_product {
136
192
{
137
193
let v = black_box( vec![ 0 ; 16 ] ) ;
@@ -144,12 +200,137 @@ bench_specializations! {
144
200
}
145
201
vs. iter( ) . multi_cartesian_product( )
146
202
}
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
+ }
147
290
tuple_combinations {
148
291
{
149
292
let v = black_box( ( 0 ..64 ) . collect_vec( ) ) ;
150
293
}
151
294
v. iter( ) . tuple_combinations:: <( _, _, _, _) >( )
152
295
}
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
+ }
153
334
while_some {
154
335
{ }
155
336
( 0 ..)
@@ -173,4 +354,174 @@ bench_specializations! {
173
354
}
174
355
xs. iter( ) . zip_longest( ys. iter( ) )
175
356
}
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
+ }
176
527
}
0 commit comments