use criterion::{black_box, criterion_group, criterion_main, Criterion, SamplingMode}; use yrs::encoding::read::{Cursor, Read}; use yrs::encoding::write::Write; use yrs::Any; const BENCHMARK_SIZE: u32 = 100000; fn bench_encoding(c: &mut Criterion) { let mut encoding_group = c.benchmark_group("encoding"); encoding_group.sampling_mode(SamplingMode::Flat); encoding_group.bench_function("var_int (64 bit)", |b| { b.iter(|| { let mut encoder = Vec::with_capacity(BENCHMARK_SIZE as usize * 8); for i in 0..(BENCHMARK_SIZE as i64) { encoder.write_var(i); } let mut decoder = Cursor::from(&encoder); for i in 0..(BENCHMARK_SIZE as i64) { let num: i64 = decoder.read_var().unwrap(); assert_eq!(num, i); } }) }); encoding_group.bench_function("var_uint (32 bit)", |b| { b.iter(|| { let mut encoder = Vec::with_capacity(BENCHMARK_SIZE as usize * 8); for i in 0..BENCHMARK_SIZE { encoder.write_var(i); } let mut decoder = Cursor::from(&encoder); for i in 0..BENCHMARK_SIZE { let num: u32 = decoder.read_var().unwrap(); assert_eq!(num, i); } }) }); encoding_group.bench_function("uint32", |b| { b.iter(|| { let mut encoder = Vec::with_capacity(BENCHMARK_SIZE as usize * 8); for i in 0..BENCHMARK_SIZE { encoder.write_u32(i); } let mut decoder = Cursor::from(&encoder); for i in 0..BENCHMARK_SIZE { let num: u32 = decoder.read_u32().unwrap(); assert_eq!(num, i); } }) }); encoding_group.bench_function("var_uint (64 bit)", |b| { b.iter(|| { let mut encoder = Vec::with_capacity(BENCHMARK_SIZE as usize * 8); for i in 0..(BENCHMARK_SIZE as u64) { encoder.write_var(i); } let mut decoder = Cursor::from(&encoder); for i in 0..(BENCHMARK_SIZE as u64) { let num: u64 = decoder.read_var().unwrap(); assert_eq!(num, i); } }) }); encoding_group.bench_function("uint64", |b| { b.iter(|| { let mut encoder = Vec::with_capacity(BENCHMARK_SIZE as usize * 8); for i in 0..(BENCHMARK_SIZE as u64) { encoder.write_u64(i) } let mut decoder = Cursor::from(&encoder); for i in 0..(BENCHMARK_SIZE as u64) { let num = decoder.read_u64().unwrap(); assert_eq!(num, i); } }) }); } fn bench_serialization(c: &mut Criterion) { use std::collections::HashMap; let any = Any::from(HashMap::from([ ("bool".into(), Any::from(true)), ("int".into(), Any::from(1)), ("negativeInt".into(), Any::from(-1)), ("maxInt".into(), Any::from(i64::MAX)), ("minInt".into(), Any::from(i64::MIN)), ("realNumber".into(), Any::from(-123.2387f64)), ("maxNumber".into(), Any::from(f64::MIN)), ("minNumber".into(), Any::from(f64::MAX)), ("null".into(), Any::Null), ( "map".into(), Any::from(HashMap::from([ ("bool".into(), Any::from(true)), ("int".into(), Any::from(1)), ("negativeInt".into(), Any::from(-1)), ("maxInt".into(), Any::from(i64::MAX)), ("minInt".into(), Any::from(i64::MIN)), ("realNumber".into(), Any::from(-123.2387f64)), ("maxNumber".into(), Any::from(f64::MIN)), ("minNumber".into(), Any::from(f64::MAX)), ("null".into(), Any::Null), ])), ), ( "key6".into(), Any::from(vec![ Any::from(true), Any::from(1), Any::from(-1), Any::from(i64::MAX), Any::from(i64::MIN), Any::from(-123.2387f64), Any::from(f64::MIN), Any::from(f64::MAX), Any::Null, ]), ), ])); let any_json = serde_json::to_string(&any).unwrap(); let mut serde_group = c.benchmark_group("serde"); serde_group.bench_function("Any-JSON roundtrip", |b| { b.iter(|| { black_box(serde_json::from_str::(&serde_json::to_string(&any).unwrap()).unwrap()); }) }); serde_group.bench_function("Any serialize", |b| { b.iter(|| { black_box(serde_json::to_string(&any).unwrap()); }) }); serde_group.bench_function("Any deserialize", |b| { b.iter(|| { black_box(serde_json::to_string(&any).unwrap()); }) }); serde_group.finish(); let mut custom_group = c.benchmark_group("custom json serialization"); custom_group.bench_function("Any-JSON roundtrip", |b| { b.iter(|| { let mut roundtrip = String::new(); any.to_json(&mut roundtrip); black_box(Any::from_json(&roundtrip)); }) }); custom_group.bench_function("Any serialize", |b| { b.iter(|| { let mut roundtrip = String::new(); black_box(any.to_json(&mut roundtrip)); }) }); custom_group.bench_function("Any deserialize", |b| { b.iter(|| { black_box(Any::from_json(&any_json)); }) }); custom_group.finish(); } criterion_group!(serialization, bench_encoding, bench_serialization); criterion_main!(serialization);