]>
git.proxmox.com Git - rustc.git/blob - vendor/itertools-0.8.2/benches/tree_fold1.rs
4 extern crate itertools
;
6 use itertools
::Itertools
;
10 trait IterEx
: Iterator
{
11 // Another efficient implementation against which to compare,
12 // but needs `std` so is less desirable.
13 fn tree_fold1_vec
<F
>(self, mut f
: F
) -> Option
<Self::Item
>
14 where F
: FnMut(Self::Item
, Self::Item
) -> Self::Item
,
17 let hint
= self.size_hint().0;
18 let cap
= std
::mem
::size_of
::<usize>() * 8 - hint
.leading_zeros() as usize;
19 let mut stack
= Vec
::with_capacity(cap
);
20 self.enumerate().foreach(|(mut i
, mut x
)| {
22 x
= f(stack
.pop().unwrap(), x
);
27 stack
.into_iter().fold1(f
)
30 impl<T
:Iterator
> IterEx
for T {}
32 macro_rules
! def_benchs
{
41 fn sum(b
: &mut Bencher
) {
42 let v
: Vec
<u32> = (0.. $N
).collect();
44 cloned(&v
).$
FUN(|x
, y
| x
+ y
)
49 fn complex_iter(b
: &mut Bencher
) {
50 let u
= (3..).take($N
/ 2);
51 let v
= (5..).take($N
/ 2);
55 it
.clone().map(|x
| x
as f32).$
FUN(f32::atan2
)
60 fn string_format(b
: &mut Bencher
) {
61 // This goes quadratic with linear `fold1`, so use a smaller
62 // size to not waste too much time in travis. The allocations
63 // in here are so expensive anyway that it'll still take
64 // way longer per iteration than the other two benchmarks.
65 let v
: Vec
<u32> = (0.. ($N
/4)).collect();
67 cloned(&v
).map(|x
| x
.to_string()).$
FUN(|x
, y
| format
!("{} + {}", x
, y
))
101 tree_fold1_stack_100
,