csv-diff 0.1.0-alpha

Compare two CSVs - with ludicrous speed 🚀.
Documentation
#![cfg(feature = "rayon-threads")]

use ::csv_diff::csv::Csv;
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use csv_diff::csv_diff;
use std::{fmt::Display, io::Cursor};
use utils::csv_generator::CsvGenerator;

fn criterion_benchmark(c: &mut Criterion) {
    let csv_byte_diff = csv_diff::CsvByteDiff::new().unwrap();

    let mut bench_group = c.benchmark_group("csv_diff");

    for (csv_gen_left, csv_gen_right) in vec![
        (CsvGenerator::new(4, 3), CsvGenerator::new(4, 3)),
        (CsvGenerator::new(4, 10), CsvGenerator::new(4, 10)),
        (CsvGenerator::new(4, 100), CsvGenerator::new(4, 100)),
        (CsvGenerator::new(4, 1000), CsvGenerator::new(4, 1000)),
        (CsvGenerator::new(10, 9), CsvGenerator::new(10, 9)),
        (CsvGenerator::new(100, 9), CsvGenerator::new(100, 9)),
        (CsvGenerator::new(1000, 9), CsvGenerator::new(1000, 9)),
        (CsvGenerator::new(10_000, 9), CsvGenerator::new(10_000, 9)),
        (CsvGenerator::new(100_000, 9), CsvGenerator::new(100_000, 9)),
        (
            CsvGenerator::new(1_000_000, 9),
            CsvGenerator::new(1_000_000, 9),
        ),
    ] {
        let (csv_left, csv_right) = (csv_gen_left.generate(), csv_gen_right.generate());

        bench_group.measurement_time(std::time::Duration::from_secs(
            if csv_gen_left.rows() == 100_000 || csv_gen_right.rows() == 100_000 {
                30
            } else if csv_gen_left.rows() == 1_000_000 || csv_gen_right.rows() == 1_000_000 {
                100
            } else {
                10
            },
        ));
        bench_group.throughput(Throughput::Bytes((csv_left.len() + csv_right.len()) as u64));
        bench_group.bench_with_input(
            BenchmarkId::from_parameter(format!("{} <> {}", csv_gen_left, csv_gen_right)),
            &(csv_left, csv_right),
            |b, (csv_left, csv_right)| {
                b.iter(|| {
                    csv_byte_diff
                        .diff(
                            Csv::new(Cursor::new(csv_left.as_slice())),
                            Csv::new(Cursor::new(csv_left.as_slice())),
                        )
                        .unwrap();
                });
            },
        );
    }
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);