Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/znippy-zoomies

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
        );
    }
}