| use criterion::{criterion_group, BenchmarkId, Criterion}; |
| |
| fn fibonacci_slow(n: u64) -> u64 { |
| match n { |
| 0 | 1 => 1, |
| n => fibonacci_slow(n - 1) + fibonacci_slow(n - 2), |
| } |
| } |
| |
| fn fibonacci_fast(n: u64) -> u64 { |
| let mut a = 0; |
| let mut b = 1; |
| |
| match n { |
| 0 => b, |
| _ => { |
| for _ in 0..n { |
| let c = a + b; |
| a = b; |
| b = c; |
| } |
| b |
| } |
| } |
| } |
| |
| fn compare_fibonaccis(c: &mut Criterion) { |
| let mut group = c.benchmark_group("Fibonacci"); |
| |
| group.bench_with_input("Recursive", &20, |b, i| b.iter(|| fibonacci_slow(*i))); |
| group.bench_with_input("Iterative", &20, |b, i| b.iter(|| fibonacci_fast(*i))); |
| } |
| fn compare_fibonaccis_group(c: &mut Criterion) { |
| let mut group = c.benchmark_group("Fibonacci3"); |
| for i in 20..=21 { |
| group.bench_with_input(BenchmarkId::new("Recursive", i), &i, |b, i| { |
| b.iter(|| fibonacci_slow(*i)) |
| }); |
| group.bench_with_input(BenchmarkId::new("Iterative", i), &i, |b, i| { |
| b.iter(|| fibonacci_fast(*i)) |
| }); |
| } |
| group.finish() |
| } |
| |
| criterion_group!(fibonaccis, compare_fibonaccis, compare_fibonaccis_group,); |