use gf2::*;
mod naive;
use std::io::Write;
use utilities_rs::Stopwatch;
fn main() {
type BV = BitVector<u8>;
let n_trials = 1_000;
let n_tick = n_trials / 20;
let len = 1_000_000;
let shift = len / 2;
let mut sh_optimized = BV::ones(len);
let mut sh_naive = BV::ones(len);
let sw = Stopwatch::default();
print!("Running {n_trials} trials of the optimized shift ");
let mut dt_optimized = sw.elapsed();
for n in 0..n_trials {
sh_optimized = &sh_optimized >> shift;
sh_optimized = &sh_optimized << shift;
if n % n_tick == 0 {
print!(".");
std::io::stdout().flush().unwrap();
}
}
println!(" done!");
dt_optimized = sw.elapsed() - dt_optimized;
print!("Running {n_trials} trials of the naive shift ");
let mut dt_naive = sw.elapsed();
for n in 0..n_trials {
sh_naive = naive::shift_right(&sh_naive, shift);
sh_naive = naive::shift_left(&sh_naive, shift);
if n % n_tick == 0 {
print!(".");
std::io::stdout().flush().unwrap();
}
}
println!(" done!");
dt_naive = sw.elapsed() - dt_naive;
assert_eq!(sh_naive, sh_optimized, "Oops the loops reached different outcomes!");
println!();
println!("Optimized shifts: {}", Stopwatch::format_seconds(dt_optimized));
println!("Naive shifts: {}", Stopwatch::format_seconds(dt_naive));
println!("Speed-up factor: {:.0}x", dt_naive / dt_optimized);
}