fastalp 0.1.41

World's fastest and highest-ratio lossless floating-point compression / 全球最快、压缩比最高的通用时序浮点无损压缩
Documentation
use std::{fs, path::PathBuf, time::Instant};

use fastalp::Encoder;

fn load_csv(path: &PathBuf) -> Vec<f64> {
  let content = fs::read_to_string(path).expect("Failed to read CSV");
  content
    .lines()
    .filter_map(|line| {
      let trimmed = line.trim();
      if trimmed.is_empty() {
        None
      } else {
        trimmed.parse::<f64>().ok()
      }
    })
    .collect()
}

fn main() {
  let alp_dir = PathBuf::from("/Users/z/git/db/ALP");
  let test_cases = [
    "basel_wind_f",
    "bird_migration_f",
    "bitcoin_f",
    "gov40",
    "poi_lat",
    "air_sensor_f",
    "neon_air_pressure",
    "neon_wind_dir",
  ];

  let mut comp_buf = Vec::with_capacity(65536);
  let mut encoder = Encoder::<f64>::with_capacity(1024);

  for name in test_cases {
    let path = alp_dir.join(format!("data/samples/{name}.csv"));
    let data = load_csv(&path);
    let raw_bytes = data.len() * 8;

    encoder.reset();
    comp_buf.clear();
    encoder.compress_into(&data, &mut comp_buf);

    let iters = 10000;
    let start = Instant::now();
    for _ in 0..iters {
      comp_buf.clear();
      encoder.compress_into(&data, &mut comp_buf);
    }
    let dur = start.elapsed();
    let ns_per_iter = dur.as_nanos() as f64 / iters as f64;
    let gb_s = (raw_bytes as f64 * iters as f64) / (dur.as_secs_f64() * 1e9);

    println!(
      "{name:<20} | {ns_per_iter:>7.1} ns/iter | {gb_s:>5.2} GB/s | scheme: {:?} | target_bw: {:?}",
      encoder.cached_scheme, encoder.cached_target_bw
    );
    fastalp::profile_compress_breakdown(&data);
  }
}