use std::{ffi::CString, fs, io::BufWriter}; use cqdb::{CQDBWriter, CQDB}; use criterion::{criterion_group, criterion_main, Criterion}; fn criterion_benchmark(c: &mut Criterion) { let mut group = c.benchmark_group("reader"); group.bench_function("cqdb-rs", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); b.iter(|| { let _db = CQDB::new(&buf).unwrap(); }) }); group.bench_function("cqdb-c", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); b.iter(|| { let db = unsafe { cqdb_sys::cqdb_reader(buf.as_ptr() as _, buf.len()) }; assert!(!db.is_null()); }) }); group.finish(); let mut group = c.benchmark_group("to_id"); group.bench_function("cqdb-rs", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); let db = CQDB::new(&buf).unwrap(); b.iter(|| { for i in 0..db.num() { let s = format!("{:08}", i); let _j = db.to_id(&s).unwrap(); } }) }); group.bench_function("cqdb-c", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); let db = unsafe { cqdb_sys::cqdb_reader(buf.as_ptr() as _, buf.len()) }; assert!(!db.is_null()); b.iter(|| { for id in 0..100 { let key = CString::new(format!("{:08}", id)).unwrap(); let _j = unsafe { cqdb_sys::cqdb_to_id(db, key.as_ptr()) }; } }) }); group.finish(); let mut group = c.benchmark_group("to_string"); group.bench_function("cqdb-rs", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); let db = CQDB::new(&buf).unwrap(); b.iter(|| { for i in 0..db.num() { let _value = db.to_str(i as u32).unwrap(); } }) }); group.bench_function("cqdb-c", |b| { let buf = fs::read("tests/fixtures/test.cqdb").unwrap(); let db = unsafe { cqdb_sys::cqdb_reader(buf.as_ptr() as _, buf.len()) }; b.iter(|| { assert!(!db.is_null()); for id in 0..100 { let _ptr = unsafe { cqdb_sys::cqdb_to_string(db, id) }; } }) }); group.finish(); let mut group = c.benchmark_group("writer"); group.bench_function("cqdb-rs", |b| { b.iter(|| { let file = fs::File::create("tests/output/cqdb-writer-bench-1.cqdb").unwrap(); let buf_writer = BufWriter::new(file); let mut writer = CQDBWriter::new(buf_writer).unwrap(); for id in 0..100 { let key = format!("{:08}", id); writer.put(&key, id).unwrap(); } drop(writer); }); fs::remove_file("tests/output/cqdb-writer-bench-1.cqdb").unwrap(); }); group.bench_function("cqdb-c", |b| { b.iter(|| { let name = CString::new("tests/output/cqdb-writer-bench-1.cqdb").unwrap(); let mode = CString::new("wb").unwrap(); unsafe { let fp = libc::fopen(name.as_ptr(), mode.as_ptr()); assert!(!fp.is_null()); let writer = cqdb_sys::cqdb_writer(fp, 0); assert!(!writer.is_null()); for i in 0..100 { let s = CString::new(format!("{:08}", i)).unwrap(); assert_eq!(0, cqdb_sys::cqdb_writer_put(writer, s.as_ptr(), i)); } assert_eq!(0, cqdb_sys::cqdb_writer_close(writer)); libc::fclose(fp); } }); fs::remove_file("tests/output/cqdb-writer-bench-1.cqdb").unwrap(); }); group.finish(); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches);