lgz/examples/filterbench.rs
//! The bit-level candidate filter alone, per CPU version: `filterbench <file>`.
//! Scans every bit offset of the file (512 per step) and counts candidates;
//! best of 5, in compressed GB/s.
use lgz::bitsplit::simd::{self, Impl};
use std::time::Instant;
fn main() {
let d = std::fs::read(std::env::args().nth(1).unwrap()).unwrap();
let step = simd::WORDS * 8 - 8; // 64 bytes advance, 72 bytes read
let words: Vec<[u64; simd::WORDS]> = (0..d.len().saturating_sub(simd::WORDS * 8) / step)
.map(|s| {
let mut w = [0u64; simd::WORDS];
for (k, v) in w.iter_mut().enumerate() {
let o = s * step + 8 * k;
*v = u64::from_le_bytes(d[o..o + 8].try_into().unwrap());
}
w
})
.collect();
for i in Impl::ALL.into_iter().filter(|i| i.available()) {
let mut best = f64::MAX;
let mut n = 0u64;
for _ in 0..5 {
let t = Instant::now();
n = 0;
for w in &words {
for m in simd::masks_with(i, w) {
n += m.count_ones() as u64;
}
}
best = best.min(t.elapsed().as_secs_f64());
}
let gb = (words.len() * step) as f64 / 1e9;
println!(
"{i:?}: {:.2} GB/s compressed scanned, {} candidates",
gb / best,
n
);
}
}