diff --git a/implementations/rust/Makefile b/implementations/rust/Makefile index 3e49826..684eb45 100644 --- a/implementations/rust/Makefile +++ b/implementations/rust/Makefile @@ -2,9 +2,12 @@ watch: cargo watch -c -x 'test --all-targets -- --nocapture' -bench: +bench: benches/testdata.bin cargo bench --benches +benches/testdata.bin: benches/testdata.bin.gz + gzip -dc $< > $@ + clippy-watch: cargo watch -c -x 'clippy --all-targets' diff --git a/implementations/rust/benches/.gitignore b/implementations/rust/benches/.gitignore new file mode 100644 index 0000000..800aca2 --- /dev/null +++ b/implementations/rust/benches/.gitignore @@ -0,0 +1 @@ +testdata.bin diff --git a/implementations/rust/benches/codec.rs b/implementations/rust/benches/codec.rs index 5509b5e..a011285 100644 --- a/implementations/rust/benches/codec.rs +++ b/implementations/rust/benches/codec.rs @@ -1,5 +1,5 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use preserves::value::{self, decoder, encoder}; +use preserves::value::{self, decoder, encoder, reader, reader::Reader}; use preserves::{de, ser}; use std::io::Read; use std::io::BufReader; @@ -79,9 +79,52 @@ pub fn bench_ser_encoder(c: &mut Criterion) { })); } +pub fn large_testdata_decoder_with_ann(c: &mut Criterion) { + let mut fh = std::fs::File::open("benches/testdata.bin").unwrap(); + let mut bs = vec![]; + fh.read_to_end(&mut bs).ok(); + c.bench_function("decode testdata.bin with annotations", |b| b.iter(|| { + let mut r = reader::from_bytes(&bs[..]); + while let Some(_) = r.next(true).unwrap() {} + })); +} + +pub fn large_testdata_decoder_without_ann(c: &mut Criterion) { + let mut fh = std::fs::File::open("benches/testdata.bin").unwrap(); + let mut bs = vec![]; + fh.read_to_end(&mut bs).ok(); + c.bench_function("decode testdata.bin without annotations", |b| b.iter(|| { + let mut r = reader::from_bytes(&bs[..]); + while let Some(_) = r.next(false).unwrap() {} + })); +} + +pub fn large_testdata_encoder(c: &mut Criterion) { + let mut fh = std::fs::File::open("benches/testdata.bin").unwrap(); + let mut vs = vec![]; + let mut r = reader::from_read(&mut fh); + while let Some(v) = r.next(true).unwrap() { + vs.push(v); + } + + c.bench_function("encode testdata.bin", |b| b.iter_with_large_drop(|| { + let mut bs = vec![]; + let mut e = encoder::Encoder::new(&mut bs); + for v in &vs { + e.write(&v).unwrap(); + } + bs + })); +} + criterion_group!(codec, bench_decoder_bytes, bench_decoder_file, bench_decoder_buffered_file, bench_encoder); criterion_group!(serde, bench_de, bench_ser); criterion_group!(codec_then_serde, bench_decoder_de, bench_ser_encoder); -criterion_main!(codec, serde, codec_then_serde); +criterion_group!{ + name = large_testdata; + config = Criterion::default().sample_size(10); + targets = large_testdata_decoder_with_ann, large_testdata_decoder_without_ann, large_testdata_encoder +} +criterion_main!(codec, serde, codec_then_serde, large_testdata); diff --git a/implementations/rust/benches/testdata.bin.gz b/implementations/rust/benches/testdata.bin.gz new file mode 100644 index 0000000..4216b79 Binary files /dev/null and b/implementations/rust/benches/testdata.bin.gz differ