use gf2::*;
use utilities_rs::Stopwatch;
mod naive;
fn main() {
let sw = Stopwatch::default();
let len = 1_000_000;
let bv: BitVector = BitVector::random(len);
let n_trials = 100_000;
let mut result_simple: usize = 0;
let mut result_iter = result_simple;
let mut result_functional = result_simple;
let mut dt_simple = sw.elapsed();
for _ in 0..n_trials {
for i in 0..bv.words() {
result_simple = result_simple ^ bv.word(i);
}
}
dt_simple = sw.elapsed() - dt_simple;
let mut dt_iter = sw.elapsed();
for _ in 0..n_trials {
for word in bv.store_words() {
result_iter = result_iter ^ word;
}
}
dt_iter = sw.elapsed() - dt_iter;
let mut dt_functional = sw.elapsed();
for _ in 0..n_trials {
result_functional = result_functional ^ bv.store_words().fold(0, |acc, word| acc ^ word);
}
dt_functional = sw.elapsed() - dt_functional;
assert_eq!(result_simple, result_iter, "Simple loop and simple iterator give different results");
assert_eq!(result_simple, result_functional, "Simple loop and functional approach give different results");
println!("Simple loop over words: {}", Stopwatch::format_seconds(dt_simple));
println!("Iterator over words: {}", Stopwatch::format_seconds(dt_iter));
println!("Functional approach: {}", Stopwatch::format_seconds(dt_functional));
}