diff --git a/crates/bench-utils/src/draw.rs b/crates/bench-utils/src/draw.rs new file mode 100644 index 00000000..f446a0e4 --- /dev/null +++ b/crates/bench-utils/src/draw.rs @@ -0,0 +1,33 @@ +use arbitrary::{Arbitrary, Unstructured}; + +#[derive(Arbitrary)] +pub struct Point { + pub x: i32, + pub y: i32, +} + +#[derive(Arbitrary)] +pub enum DrawAction { + DrawPath { + points: Vec, + color: i32, + }, + Text { + id: i32, + text: String, + pos: Point, + width: i32, + height: i32, + }, +} + +pub fn gen_draw_actions(seed: u64, num: usize) -> Vec { + let be_bytes = seed.to_be_bytes(); + let mut gen = Unstructured::new(&be_bytes); + let mut ans = vec![]; + for _ in 0..num { + ans.push(gen.arbitrary().unwrap()); + } + + ans +} diff --git a/crates/bench-utils/src/lib.rs b/crates/bench-utils/src/lib.rs index fcab8e8c..b5955210 100644 --- a/crates/bench-utils/src/lib.rs +++ b/crates/bench-utils/src/lib.rs @@ -1,3 +1,4 @@ +pub mod draw; use arbitrary::Arbitrary; use enum_as_inner::EnumAsInner; use rand::{rngs::StdRng, RngCore, SeedableRng}; diff --git a/crates/loro-internal/benches/draw.rs b/crates/loro-internal/benches/draw.rs new file mode 100644 index 00000000..8cbea72d --- /dev/null +++ b/crates/loro-internal/benches/draw.rs @@ -0,0 +1,36 @@ +use bench_utils::draw::{gen_draw_actions, DrawAction}; +use criterion::{criterion_group, criterion_main, Criterion}; +use loro_internal::LoroDoc; + +pub fn draw(c: &mut Criterion) { + let mut data = None; + c.bench_function("simulate drawing", |b| { + if data.is_none() { + data = Some(gen_draw_actions(100, 1000)); + } + + let mut loro = LoroDoc::new(); + b.iter(|| { + loro = LoroDoc::new(); + let paths = loro.get_list("all_paths"); + let texts = loro.get_list("all_texts"); + for action in data.as_ref().unwrap().iter() { + match action { + DrawAction::DrawPath { points, color } => {} + DrawAction::Text { + id, + text, + pos, + width, + height, + } => todo!(), + } + } + }); + + println!("Snapshot size = {}", loro.export_snapshot().len()) + }); +} + +criterion_group!(benches, draw); +criterion_main!(benches); diff --git a/crates/loro-internal/examples/encoding.rs b/crates/loro-internal/examples/encoding.rs index de98b778..bd428eed 100644 --- a/crates/loro-internal/examples/encoding.rs +++ b/crates/loro-internal/examples/encoding.rs @@ -24,7 +24,7 @@ fn main() { let data = loro.export_from(&Default::default()); let start = Instant::now(); - for _ in 0..10 { + for _ in 0..100 { let mut b = LoroDoc::default(); b.detach(); b.import(&data).unwrap();