From 8893408c30662713e7ea2664634880b8e053753b Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Wed, 7 Feb 2018 21:56:28 -0800 Subject: [PATCH] add a gcd benchmark --- Cargo.toml | 3 ++ benches/gcd.rs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100755 benches/gcd.rs diff --git a/Cargo.toml b/Cargo.toml index 9eff655..241e6af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ readme = "README.md" [[bench]] name = "bigint" +[[bench]] +name = "gcd" + [[bench]] harness = false name = "shootout-pidigits" diff --git a/benches/gcd.rs b/benches/gcd.rs new file mode 100755 index 0000000..695aee8 --- /dev/null +++ b/benches/gcd.rs @@ -0,0 +1,84 @@ +#![feature(test)] + +extern crate test; +extern crate num_bigint; +extern crate num_integer; +extern crate num_traits; +extern crate rand; + +use test::Bencher; +use num_bigint::{BigUint, RandBigInt}; +use num_integer::Integer; +use num_traits::Zero; +use rand::{SeedableRng, StdRng}; + +fn get_rng() -> StdRng { + let seed: &[_] = &[1, 2, 3, 4]; + SeedableRng::from_seed(seed) +} + +fn bench(b: &mut Bencher, bits: usize, gcd: fn(&BigUint, &BigUint) -> BigUint) { + let mut rng = get_rng(); + let x = rng.gen_biguint(bits); + let y = rng.gen_biguint(bits); + + assert_eq!(euclid(&x, &y), x.gcd(&y)); + + b.iter(|| gcd(&x, &y)); +} + + +fn euclid(x: &BigUint, y: &BigUint) -> BigUint { + // Use Euclid's algorithm + let mut m = x.clone(); + let mut n = y.clone(); + while !m.is_zero() { + let temp = m; + m = n % &temp; + n = temp; + } + return n; +} + +#[bench] +fn gcd_euclid_0064(b: &mut Bencher) { + bench(b, 64, euclid); +} + +#[bench] +fn gcd_euclid_0256(b: &mut Bencher) { + bench(b, 256, euclid); +} + +#[bench] +fn gcd_euclid_1024(b: &mut Bencher) { + bench(b, 1024, euclid); +} + +#[bench] +fn gcd_euclid_4096(b: &mut Bencher) { + bench(b, 4096, euclid); +} + + +// Integer for BigUint now uses Stein for gcd + +#[bench] +fn gcd_stein_0064(b: &mut Bencher) { + bench(b, 64, BigUint::gcd); +} + +#[bench] +fn gcd_stein_0256(b: &mut Bencher) { + bench(b, 256, BigUint::gcd); +} + +#[bench] +fn gcd_stein_1024(b: &mut Bencher) { + bench(b, 1024, BigUint::gcd); +} + +#[bench] +fn gcd_stein_4096(b: &mut Bencher) { + bench(b, 4096, BigUint::gcd); +}