From f96b2b2113fac3c1d283afa65cbca42750e000df Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Sun, 6 Sep 2020 22:44:08 -0700 Subject: [PATCH] benches: Add benchmarks This allows comparison of alternative implementaitons, and to the f64::sqrt() implementation. Signed-off-by: Joe Richey --- benches/sqrt.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 benches/sqrt.rs diff --git a/benches/sqrt.rs b/benches/sqrt.rs new file mode 100644 index 0000000..693fc1c --- /dev/null +++ b/benches/sqrt.rs @@ -0,0 +1,73 @@ +#![feature(test)] + +extern crate test; +use test::{black_box, Bencher}; + +extern crate integer_sqrt; +use integer_sqrt::IntegerSquareRoot; + +// Use f64::sqrt to compute the integer sqrt +fn isqrt_via_f64(n: u64) -> u64 { + let cand = (n as f64).sqrt() as u64; + // Rounding can cause off-by-one errors + if let Some(prod) = cand.checked_mul(cand) { + if prod <= n { + return cand; + } + } + cand - 1 +} + +#[bench] +fn isqrt_small(b: &mut Bencher) { + let small = 63u64; + b.iter(|| { + let n = black_box(small); + assert_eq!(n.integer_sqrt_checked(), Some(7)); + }) +} + +#[bench] +fn isqrt_med(b: &mut Bencher) { + let med = 10_000_000_000u64; // 10^10 + b.iter(|| { + let n = black_box(med); + assert_eq!(n.integer_sqrt_checked(), Some(100_000)); // 10^5 + }) +} + +#[bench] +fn isqrt_large(b: &mut Bencher) { + let large = u64::MAX; + b.iter(|| { + let n = black_box(large); + assert_eq!(n.integer_sqrt_checked(), Some((1u64 << 32) - 1)); + }) +} + +#[bench] +fn isqrt_f64_small(b: &mut Bencher) { + let small = 63u64; + b.iter(|| { + let n = black_box(small); + assert_eq!(isqrt_via_f64(n), 7); + }) +} + +#[bench] +fn isqrt_f64_med(b: &mut Bencher) { + let med = 10_000_000_000u64; // 10^10 + b.iter(|| { + let n = black_box(med); + assert_eq!(isqrt_via_f64(n), 100_000); // 10^5 + }) +} + +#[bench] +fn isqrt_f64_large(b: &mut Bencher) { + let large = u64::MAX; + b.iter(|| { + let n = black_box(large); + assert_eq!(isqrt_via_f64(n), (1u64 << 32) - 1); + }) +}