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:
parent
9e6ffa6f81
commit
f96b2b2113
|
@ -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);
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue