No code coverage for benchmarks
timw4mail/rusty-numbers/pipeline/head There was a failure building this commit Details

This commit is contained in:
Timothy Warren 2020-03-05 08:32:38 -05:00
parent 272b7360f5
commit f352c1aa4e
2 changed files with 89 additions and 84 deletions

View File

@ -1,101 +1,107 @@
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use criterion::{criterion_group, criterion_main};
use rusty_numbers::num::Unsigned;
use rusty_numbers::{factorial, fibonacci, it_factorial, mem_fibonacci, rec_fibonacci};
fn bench_factorial(c: &mut Criterion) { #[cfg_attr(tarpaulin, skip)]
let mut group = c.benchmark_group("Factorials"); mod sf {
use criterion::{black_box, BenchmarkId, Criterion};
use rusty_numbers::num::Unsigned;
use rusty_numbers::{factorial, fibonacci, it_factorial, mem_fibonacci, rec_fibonacci};
for i in [0usize, 5, 10, 15, 20, 25, 30, 34].iter() { pub fn bench_factorial(c: &mut Criterion) {
group.bench_with_input(BenchmarkId::new("Recursive naive", i), i, |b, i| { let mut group = c.benchmark_group("Factorials");
b.iter(|| factorial(black_box(*i)))
});
group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| {
b.iter(|| it_factorial(black_box(*i)))
});
}
group.finish();
}
fn bench_fibonacci(c: &mut Criterion) { for i in [0usize, 5, 10, 15, 20, 25, 30, 34].iter() {
let mut group = c.benchmark_group("Fibonacci"); group.bench_with_input(BenchmarkId::new("Recursive naive", i), i, |b, i| {
b.iter(|| factorial(black_box(*i)))
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| { group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| {
b.iter(|| mem_fibonacci(black_box(*i))) b.iter(|| it_factorial(black_box(*i)))
}); });
group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| { }
b.iter(|| fibonacci(black_box(*i))) group.finish();
});
} }
group.finish(); pub fn bench_fibonacci(c: &mut Criterion) {
let mut group = c.benchmark_group("Fibonacci");
let mut group = c.benchmark_group("Recursive Fibonacci"); for i in [0usize, 10, 20, 30, 40, 50, 70, 93, 140, 186].iter() {
for i in [0usize, 10, 20, 25, 26, 27, 28, 29, 30].iter() { group.bench_with_input(BenchmarkId::new("Recursive memoized", i), i, |b, i| {
group.bench_with_input(BenchmarkId::new("Naive Recursive", i), i, |b, i| { b.iter(|| mem_fibonacci(black_box(*i)))
b.iter(|| rec_fibonacci(black_box(*i))) });
}); group.bench_with_input(BenchmarkId::new("Iterative", i), i, |b, i| {
} b.iter(|| fibonacci(black_box(*i)))
group.finish(); });
} }
fn bench_gcd(c: &mut Criterion) { group.finish();
let mut group = c.benchmark_group("GCD");
#[derive(Debug)] let mut group = c.benchmark_group("Recursive Fibonacci");
struct Gcd { for i in [0usize, 10, 20, 25, 26, 27, 28, 29, 30].iter() {
left: u128, group.bench_with_input(BenchmarkId::new("Naive Recursive", i), i, |b, i| {
right: u128, b.iter(|| rec_fibonacci(black_box(*i)))
left_fib: u128, });
right_fib: u128, }
group.finish();
} }
impl Gcd { pub fn bench_gcd(c: &mut Criterion) {
fn new(left: u128, right: u128) -> Self { let mut group = c.benchmark_group("GCD");
Gcd {
left, #[derive(Debug)]
right, struct Gcd {
left_fib: fibonacci(left as usize).unwrap(), left: u128,
right_fib: fibonacci(right as usize).unwrap(), right: u128,
left_fib: u128,
right_fib: u128,
}
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(),
}
} }
} }
}
let max = Gcd::new(185, 186); let max = Gcd::new(185, 186);
let med = Gcd::new(92, 93); let med = Gcd::new(92, 93);
let small = Gcd::new(14, 15); let small = Gcd::new(14, 15);
for input in [small, med, max].iter() { for input in [small, med, max].iter() {
group.bench_with_input( group.bench_with_input(
BenchmarkId::new("Binary", input.left), BenchmarkId::new("Binary", input.left),
input, input,
|bench, input| { |bench, input| {
let a = input.left_fib; let a = input.left_fib;
let b = input.right_fib; let b = input.right_fib;
bench.iter(|| u128::gcd(black_box(a), black_box(b))) bench.iter(|| u128::gcd(black_box(a), black_box(b)))
}, },
); );
group.bench_with_input( group.bench_with_input(
BenchmarkId::new("Stein", input.left), BenchmarkId::new("Stein", input.left),
input, input,
|bench, input| { |bench, input| {
let a = input.left_fib; let a = input.left_fib;
let b = input.right_fib; let b = input.right_fib;
bench.iter(|| u128::stein_gcd(black_box(a), black_box(b))) bench.iter(|| u128::stein_gcd(black_box(a), black_box(b)))
}, },
); );
group.bench_with_input( group.bench_with_input(
BenchmarkId::new("Euclid", input.left), BenchmarkId::new("Euclid", input.left),
input, input,
|bench, input| { |bench, input| {
let a = input.left_fib; let a = input.left_fib;
let b = input.right_fib; let b = input.right_fib;
bench.iter(|| u128::e_gcd(black_box(a), black_box(b))) bench.iter(|| u128::e_gcd(black_box(a), black_box(b)))
}, },
); );
}
group.finish();
} }
group.finish();
} }
criterion_group!(benches, bench_factorial, bench_fibonacci, bench_gcd); criterion_group!(benches, sf::bench_factorial, sf::bench_fibonacci, sf::bench_gcd);
criterion_main!(benches); criterion_main!(benches);

View File

@ -6,7 +6,6 @@
use std::f64::consts::PI; use std::f64::consts::PI;
use std::f64::consts::E; use std::f64::consts::E;
#[cfg_attr(tarpaulin, skip)]
pub mod bigint; pub mod bigint;
pub mod num; pub mod num;
pub mod rational; pub mod rational;