rusty-numbers/benches/stock_functions.rs

102 lines
3.1 KiB
Rust
Raw Normal View History

use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
2020-02-21 16:33:00 -05:00
use rusty_numbers::num::Unsigned;
2020-02-21 13:15:05 -05:00
use rusty_numbers::{factorial, fibonacci, it_factorial, mem_fibonacci, rec_fibonacci};
2020-02-20 17:13:46 -05:00
fn bench_factorial(c: &mut Criterion) {
let mut group = c.benchmark_group("Factorials");
for i in [0usize, 5, 10, 15, 20, 25, 30, 34].iter() {
group.bench_with_input(BenchmarkId::new("Recursive naive", i), i, |b, i| {
2020-02-21 16:33:00 -05:00
b.iter(|| factorial(black_box(*i)))
});
2020-02-21 13:15:05 -05:00
group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| {
2020-02-21 16:33:00 -05:00
b.iter(|| it_factorial(black_box(*i)))
2020-02-21 13:15:05 -05:00
});
}
2020-02-20 17:13:46 -05:00
group.finish();
}
fn bench_fibonacci(c: &mut Criterion) {
let mut group = c.benchmark_group("Fibonacci");
2020-02-21 16:33:00 -05:00
for i in [0usize, 10, 20, 30, 40, 50, 70, 93, 140, 186].iter() {
group.bench_with_input(BenchmarkId::new("Recursive memoized", i), i, |b, i| {
2020-02-21 16:33:00 -05:00
b.iter(|| mem_fibonacci(black_box(*i)))
});
group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| {
2020-02-21 16:33:00 -05:00
b.iter(|| fibonacci(black_box(*i)))
});
}
2020-02-21 13:15:05 -05:00
group.finish();
let mut group = c.benchmark_group("Recursive Fibonacci");
2020-02-21 16:33:00 -05:00
for i in [0usize, 10, 20, 25, 26, 27, 28, 29, 30].iter() {
2020-02-21 13:15:05 -05:00
group.bench_with_input(BenchmarkId::new("Naive Recursive", i), i, |b, i| {
2020-02-21 16:33:00 -05:00
b.iter(|| rec_fibonacci(black_box(*i)))
2020-02-21 13:15:05 -05:00
});
}
group.finish();
2020-02-20 17:13:46 -05:00
}
2020-02-21 16:33:00 -05:00
fn bench_gcd(c: &mut Criterion) {
let mut group = c.benchmark_group("GCD");
2020-02-24 16:30:59 -05:00
#[derive(Debug)]
struct Gcd {
left: u128,
right: u128,
left_fib: u128,
right_fib: u128,
}
2020-02-21 16:33:00 -05:00
2020-02-24 16:30:59 -05:00
impl Gcd {
fn new(left: u128, right: u128) -> Self {
Gcd {
left,
right,
left_fib: fibonacci(left as usize).unwrap(),
right_fib: fibonacci(right as usize).unwrap(),
}
}
}
2020-02-21 16:33:00 -05:00
2020-02-24 16:30:59 -05:00
let max = Gcd::new(185, 186);
let med = Gcd::new(92, 93);
let small = Gcd::new(14, 15);
2020-02-21 16:33:00 -05:00
2020-02-24 16:30:59 -05:00
for input in [small, med, max].iter() {
2020-02-28 17:11:36 -05:00
group.bench_with_input(
BenchmarkId::new("Binary", input.left),
input,
|bench, input| {
let a = input.left_fib;
let b = input.right_fib;
bench.iter(|| u128::gcd(black_box(a), black_box(b)))
},
);
group.bench_with_input(
BenchmarkId::new("Stein", input.left),
input,
|bench, input| {
let a = input.left_fib;
let b = input.right_fib;
bench.iter(|| u128::stein_gcd(black_box(a), black_box(b)))
},
);
group.bench_with_input(
BenchmarkId::new("Euclid", input.left),
input,
|bench, input| {
let a = input.left_fib;
let b = input.right_fib;
bench.iter(|| u128::e_gcd(black_box(a), black_box(b)))
},
);
2020-02-21 16:33:00 -05:00
}
group.finish();
}
criterion_group!(benches, bench_factorial, bench_fibonacci, bench_gcd);
2020-02-20 17:13:46 -05:00
criterion_main!(benches);