74 lines
1.5 KiB
Rust
74 lines
1.5 KiB
Rust
#![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);
|
|
})
|
|
}
|