benches: Add benchmarks

This allows comparison of alternative implementaitons, and to the
f64::sqrt() implementation.

Signed-off-by: Joe Richey <joerichey@google.com>
This commit is contained in:
Joe Richey 2020-09-06 22:44:08 -07:00
parent 9e6ffa6f81
commit f96b2b2113
No known key found for this signature in database
GPG Key ID: 1DD6D05AA306C53F
1 changed files with 73 additions and 0 deletions

73
benches/sqrt.rs Normal file
View File

@ -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);
})
}