]>
git.proxmox.com Git - rustc.git/blob - vendor/itertools/benches/bench1.rs
4 #[macro_use] extern crate itertools;
7 use itertools
::Itertools
;
9 use itertools
::free
::cloned
;
11 use std
::iter
::repeat
;
20 fn slice_iter(b
: &mut test
::Bencher
)
22 let xs
: Vec
<_
> = repeat(1i32).take(20).collect();
23 b
.iter(|| for elt
in xs
.iter() {
29 fn slice_iter_rev(b
: &mut test
::Bencher
)
31 let xs
: Vec
<_
> = repeat(1i32).take(20).collect();
32 b
.iter(|| for elt
in xs
.iter().rev() {
38 fn zip_default_zip(b
: &mut test
::Bencher
)
40 let xs
= vec
![0; 1024];
41 let ys
= vec
![0; 768];
42 let xs
= black_box(xs
);
43 let ys
= black_box(ys
);
46 for (&x
, &y
) in xs
.iter().zip(&ys
) {
54 fn zipdot_i32_default_zip(b
: &mut test
::Bencher
)
56 let xs
= vec
![2; 1024];
57 let ys
= vec
![2; 768];
58 let xs
= black_box(xs
);
59 let ys
= black_box(ys
);
63 for (&x
, &y
) in xs
.iter().zip(&ys
) {
71 fn zipdot_f32_default_zip(b
: &mut test
::Bencher
)
73 let xs
= vec
![2f32; 1024];
74 let ys
= vec
![2f32; 768];
75 let xs
= black_box(xs
);
76 let ys
= black_box(ys
);
80 for (&x
, &y
) in xs
.iter().zip(&ys
) {
88 fn zip_default_zip3(b
: &mut test
::Bencher
)
90 let xs
= vec
![0; 1024];
91 let ys
= vec
![0; 768];
92 let zs
= vec
![0; 766];
93 let xs
= black_box(xs
);
94 let ys
= black_box(ys
);
95 let zs
= black_box(zs
);
98 for ((&x
, &y
), &z
) in xs
.iter().zip(&ys
).zip(&zs
) {
107 fn zip_slices_ziptuple(b
: &mut test
::Bencher
)
109 let xs
= vec
![0; 1024];
110 let ys
= vec
![0; 768];
113 let xs
= black_box(&xs
);
114 let ys
= black_box(&ys
);
115 for (&x
, &y
) in itertools
::multizip((xs
, ys
)) {
123 fn zipslices(b
: &mut test
::Bencher
)
125 let xs
= vec
![0; 1024];
126 let ys
= vec
![0; 768];
127 let xs
= black_box(xs
);
128 let ys
= black_box(ys
);
131 for (&x
, &y
) in ZipSlices
::new(&xs
, &ys
) {
139 fn zipslices_mut(b
: &mut test
::Bencher
)
141 let xs
= vec
![0; 1024];
142 let ys
= vec
![0; 768];
143 let xs
= black_box(xs
);
144 let mut ys
= black_box(ys
);
147 for (&x
, &mut y
) in ZipSlices
::from_slices(&xs
[..], &mut ys
[..]) {
155 fn zipdot_i32_zipslices(b
: &mut test
::Bencher
)
157 let xs
= vec
![2; 1024];
158 let ys
= vec
![2; 768];
159 let xs
= black_box(xs
);
160 let ys
= black_box(ys
);
164 for (&x
, &y
) in ZipSlices
::new(&xs
, &ys
) {
172 fn zipdot_f32_zipslices(b
: &mut test
::Bencher
)
174 let xs
= vec
![2f32; 1024];
175 let ys
= vec
![2f32; 768];
176 let xs
= black_box(xs
);
177 let ys
= black_box(ys
);
181 for (&x
, &y
) in ZipSlices
::new(&xs
, &ys
) {
190 fn zip_checked_counted_loop(b
: &mut test
::Bencher
)
192 let xs
= vec
![0; 1024];
193 let ys
= vec
![0; 768];
194 let xs
= black_box(xs
);
195 let ys
= black_box(ys
);
198 // Must slice to equal lengths, and then bounds checks are eliminated!
199 let len
= cmp
::min(xs
.len(), ys
.len());
213 fn zipdot_i32_checked_counted_loop(b
: &mut test
::Bencher
)
215 let xs
= vec
![2; 1024];
216 let ys
= vec
![2; 768];
217 let xs
= black_box(xs
);
218 let ys
= black_box(ys
);
221 // Must slice to equal lengths, and then bounds checks are eliminated!
222 let len
= cmp
::min(xs
.len(), ys
.len());
236 fn zipdot_f32_checked_counted_loop(b
: &mut test
::Bencher
)
238 let xs
= vec
![2f32; 1024];
239 let ys
= vec
![2f32; 768];
240 let xs
= black_box(xs
);
241 let ys
= black_box(ys
);
244 // Must slice to equal lengths, and then bounds checks are eliminated!
245 let len
= cmp
::min(xs
.len(), ys
.len());
259 fn zipdot_f32_checked_counted_unrolled_loop(b
: &mut test
::Bencher
)
261 let xs
= vec
![2f32; 1024];
262 let ys
= vec
![2f32; 768];
263 let xs
= black_box(xs
);
264 let ys
= black_box(ys
);
267 // Must slice to equal lengths, and then bounds checks are eliminated!
268 let len
= cmp
::min(xs
.len(), ys
.len());
269 let mut xs
= &xs
[..len
];
270 let mut ys
= &ys
[..len
];
273 let (mut p0
, mut p1
, mut p2
, mut p3
, mut p4
, mut p5
, mut p6
, mut p7
) =
274 (0., 0., 0., 0., 0., 0., 0., 0.);
276 // how to unroll and have bounds checks eliminated (by cristicbz)
277 // split sum into eight parts to enable vectorization (by bluss)
278 while xs
.len() >= 8 {
296 for i
in 0..xs
.len() {
304 fn zip_unchecked_counted_loop(b
: &mut test
::Bencher
)
306 let xs
= vec
![0; 1024];
307 let ys
= vec
![0; 768];
308 let xs
= black_box(xs
);
309 let ys
= black_box(ys
);
312 let len
= cmp
::min(xs
.len(), ys
.len());
315 let x
= *xs
.get_unchecked(i
);
316 let y
= *ys
.get_unchecked(i
);
325 fn zipdot_i32_unchecked_counted_loop(b
: &mut test
::Bencher
)
327 let xs
= vec
![2; 1024];
328 let ys
= vec
![2; 768];
329 let xs
= black_box(xs
);
330 let ys
= black_box(ys
);
333 let len
= cmp
::min(xs
.len(), ys
.len());
337 let x
= *xs
.get_unchecked(i
);
338 let y
= *ys
.get_unchecked(i
);
347 fn zipdot_f32_unchecked_counted_loop(b
: &mut test
::Bencher
)
349 let xs
= vec
![2.; 1024];
350 let ys
= vec
![2.; 768];
351 let xs
= black_box(xs
);
352 let ys
= black_box(ys
);
355 let len
= cmp
::min(xs
.len(), ys
.len());
359 let x
= *xs
.get_unchecked(i
);
360 let y
= *ys
.get_unchecked(i
);
369 fn zip_unchecked_counted_loop3(b
: &mut test
::Bencher
)
371 let xs
= vec
![0; 1024];
372 let ys
= vec
![0; 768];
373 let zs
= vec
![0; 766];
374 let xs
= black_box(xs
);
375 let ys
= black_box(ys
);
376 let zs
= black_box(zs
);
379 let len
= cmp
::min(xs
.len(), cmp
::min(ys
.len(), zs
.len()));
382 let x
= *xs
.get_unchecked(i
);
383 let y
= *ys
.get_unchecked(i
);
384 let z
= *zs
.get_unchecked(i
);
394 fn group_by_lazy_1(b
: &mut test
::Bencher
) {
395 let mut data
= vec
![0; 1024];
396 for (index
, elt
) in data
.iter_mut().enumerate() {
400 let data
= test
::black_box(data
);
403 for (_key
, group
) in &data
.iter().group_by(|elt
| **elt
) {
405 test
::black_box(elt
);
412 fn group_by_lazy_2(b
: &mut test
::Bencher
) {
413 let mut data
= vec
![0; 1024];
414 for (index
, elt
) in data
.iter_mut().enumerate() {
418 let data
= test
::black_box(data
);
421 for (_key
, group
) in &data
.iter().group_by(|elt
| **elt
) {
423 test
::black_box(elt
);
430 fn slice_chunks(b
: &mut test
::Bencher
) {
431 let data
= vec
![0; 1024];
433 let data
= test
::black_box(data
);
434 let sz
= test
::black_box(10);
437 for group
in data
.chunks(sz
) {
439 test
::black_box(elt
);
446 fn chunks_lazy_1(b
: &mut test
::Bencher
) {
447 let data
= vec
![0; 1024];
449 let data
= test
::black_box(data
);
450 let sz
= test
::black_box(10);
453 for group
in &data
.iter().chunks(sz
) {
455 test
::black_box(elt
);
462 fn equal(b
: &mut test
::Bencher
) {
463 let data
= vec
![7; 1024];
465 let alpha
= test
::black_box(&data
[1..]);
466 let beta
= test
::black_box(&data
[..l
- 1]);
468 itertools
::equal(alpha
, beta
)
473 fn merge_default(b
: &mut test
::Bencher
) {
474 let mut data1
= vec
![0; 1024];
475 let mut data2
= vec
![0; 800];
477 for (_
, elt
) in data1
.iter_mut().enumerate() {
483 for (i
, elt
) in data2
.iter_mut().enumerate() {
491 let data1
= test
::black_box(data1
);
492 let data2
= test
::black_box(data2
);
494 data1
.iter().merge(&data2
).count()
499 fn merge_by_cmp(b
: &mut test
::Bencher
) {
500 let mut data1
= vec
![0; 1024];
501 let mut data2
= vec
![0; 800];
503 for (_
, elt
) in data1
.iter_mut().enumerate() {
509 for (i
, elt
) in data2
.iter_mut().enumerate() {
517 let data1
= test
::black_box(data1
);
518 let data2
= test
::black_box(data2
);
520 data1
.iter().merge_by(&data2
, PartialOrd
::le
).count()
525 fn merge_by_lt(b
: &mut test
::Bencher
) {
526 let mut data1
= vec
![0; 1024];
527 let mut data2
= vec
![0; 800];
529 for (_
, elt
) in data1
.iter_mut().enumerate() {
535 for (i
, elt
) in data2
.iter_mut().enumerate() {
543 let data1
= test
::black_box(data1
);
544 let data2
= test
::black_box(data2
);
546 data1
.iter().merge_by(&data2
, |a
, b
| a
<= b
).count()
551 fn kmerge_default(b
: &mut test
::Bencher
) {
552 let mut data1
= vec
![0; 1024];
553 let mut data2
= vec
![0; 800];
555 for (_
, elt
) in data1
.iter_mut().enumerate() {
561 for (i
, elt
) in data2
.iter_mut().enumerate() {
569 let data1
= test
::black_box(data1
);
570 let data2
= test
::black_box(data2
);
571 let its
= &[data1
.iter(), data2
.iter()];
573 its
.iter().cloned().kmerge().count()
578 fn kmerge_tenway(b
: &mut test
::Bencher
) {
579 let mut data
= vec
![0; 10240];
581 let mut state
= 1729u16;
582 fn rng(state
: &mut u16) -> u16 {
583 let new
= state
.wrapping_mul(31421) + 6927;
588 for elt
in &mut data
{
589 *elt
= rng(&mut state
);
592 let mut chunks
= Vec
::new();
593 let mut rest
= &mut data
[..];
594 while rest
.len() > 0 {
595 let chunk_len
= 1 + rng(&mut state
) % 512;
596 let chunk_len
= cmp
::min(rest
.len(), chunk_len
as usize);
597 let (fst
, tail
) = {rest}
.split_at_mut(chunk_len
);
599 chunks
.push(fst
.iter().cloned());
603 // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len())));
606 chunks
.iter().cloned().kmerge().count()
611 fn fast_integer_sum
<I
>(iter
: I
) -> I
::Item
612 where I
: IntoIterator
,
613 I
::Item
: Default
+ Add
<Output
=I
::Item
>
615 iter
.into_iter().fold(<_
>::default(), |x
, y
| x
+ y
)
620 fn step_vec_2(b
: &mut test
::Bencher
) {
621 let v
= vec
![0; 1024];
623 fast_integer_sum(cloned(v
.iter().step(2)))
628 fn step_vec_10(b
: &mut test
::Bencher
) {
629 let v
= vec
![0; 1024];
631 fast_integer_sum(cloned(v
.iter().step(10)))
636 fn step_range_2(b
: &mut test
::Bencher
) {
637 let v
= black_box(0..1024);
639 fast_integer_sum(v
.clone().step(2))
644 fn step_range_10(b
: &mut test
::Bencher
) {
645 let v
= black_box(0..1024);
647 fast_integer_sum(v
.clone().step(10))
652 fn cartesian_product_iterator(b
: &mut test
::Bencher
)
654 let xs
= vec
![0; 16];
658 for (&x
, &y
, &z
) in iproduct
!(&xs
, &xs
, &xs
) {
668 fn cartesian_product_fold(b
: &mut test
::Bencher
)
670 let xs
= vec
![0; 16];
674 iproduct
!(&xs
, &xs
, &xs
).fold((), |(), (&x
, &y
, &z
)| {
684 fn multi_cartesian_product_iterator(b
: &mut test
::Bencher
)
686 let xs
= [vec
![0; 16], vec
![0; 16], vec
![0; 16]];
690 for x
in xs
.into_iter().multi_cartesian_product() {
700 fn multi_cartesian_product_fold(b
: &mut test
::Bencher
)
702 let xs
= [vec
![0; 16], vec
![0; 16], vec
![0; 16]];
706 xs
.into_iter().multi_cartesian_product().fold((), |(), x
| {
716 fn cartesian_product_nested_for(b
: &mut test
::Bencher
)
718 let xs
= vec
![0; 16];