From 728002daf7840cf97700ad2eace2ca7e45094b80 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Mon, 28 Aug 2023 16:16:40 +0800 Subject: [PATCH] chore: add encode example to analysis perf --- crates/loro-internal/examples/encoding.rs | 87 ++++++----------------- crates/loro-internal/src/loro.rs | 7 ++ crates/loro-internal/src/oplog.rs | 2 + 3 files changed, 29 insertions(+), 67 deletions(-) diff --git a/crates/loro-internal/examples/encoding.rs b/crates/loro-internal/examples/encoding.rs index 8211452d..e804e1b3 100644 --- a/crates/loro-internal/examples/encoding.rs +++ b/crates/loro-internal/examples/encoding.rs @@ -1,72 +1,25 @@ - - - - - - - +use bench_utils::TextAction; +use loro_internal::LoroDoc; fn main() { - // let actions = bench_utils::get_automerge_actions(); - // let mut loro = LoroDoc::default(); - // let mut text = loro.get_text("text"); - // let mut txn = loro.txn().unwrap(); + let actions = bench_utils::get_automerge_actions(); + let loro = LoroDoc::default(); + let text = loro.get_text("text"); + let mut txn = loro.txn().unwrap(); - // for TextAction { pos, ins, del } in actions.iter() { - // text.delete(&mut txn, *pos, *del).unwrap(); - // text.insert(&mut txn, *pos, ins).unwrap(); - // } - // drop(txn); + for TextAction { pos, ins, del } in actions.iter() { + text.delete(&mut txn, *pos, *del).unwrap(); + text.insert(&mut txn, *pos, ins).unwrap(); + } - // let start = Instant::now(); - // let buf = loro.export_from(&VersionVector::new()); - // println!( - // "encode changes {} bytes, used {}ms", - // buf.len(), - // start.elapsed().as_millis() - // ); - // let json_ori = loro.to_json(); - // let start = Instant::now(); - // let buf_snapshot = loro.encode_all(); - // let _json_snapshot = loro.to_json(); - - // println!( - // "encode snapshot {} bytes, used {}ms", - // buf_snapshot.len(), - // start.elapsed().as_millis() - // ); - // let json_snapshot = loro.to_json(); - // let mut loro = LoroCore::default(); - // let start = Instant::now(); - // loro.decode(&buf).unwrap(); - // println!("decode rle_updates used {}ms", start.elapsed().as_millis()); - // let buf2 = loro.encode_with_cfg(EncodeMode::RleUpdates(VersionVector::new())); - // assert_eq!(buf, buf2); - // let json2 = loro.to_json(); - // assert_eq!(json_ori, json2); - - // let start = Instant::now(); - // let mut loro2 = LoroCore::default(); - // loro2.decode(&buf_snapshot).unwrap(); - // println!("decode snapshot used {}ms", start.elapsed().as_millis()); - // let json3 = loro2.to_json(); - // assert_eq!(json_snapshot, json3); - - // let start = Instant::now(); - // let update_buf = loro.encode_with_cfg(EncodeMode::Updates(VersionVector::new())); - // println!( - // "encode updates {} bytes, used {}ms", - // update_buf.len(), - // start.elapsed().as_millis() - // ); - // let mut encoder = GzEncoder::new(Vec::new(), flate2::Compression::default()); - // encoder.write_all(&update_buf).unwrap(); - // let data = encoder.finish().unwrap(); - // println!("After compress updates have {} bytes", data.len()); - // let mut loro3 = LoroCore::default(); - // let start = Instant::now(); - // loro3.decode(&update_buf).unwrap(); - // println!("decode updates used {}ms", start.elapsed().as_millis()); - // let json_update = loro3.to_json(); - // assert_eq!(json_ori, json_update); + txn.commit().unwrap(); + for _ in 0..10 { + loro.export_from(&Default::default()); + } + let data = loro.export_from(&Default::default()); + for _ in 0..100 { + let mut b = LoroDoc::default(); + b.detach(); + b.import(&data).unwrap(); + } } diff --git a/crates/loro-internal/src/loro.rs b/crates/loro-internal/src/loro.rs index 7b5e55df..aee0e045 100644 --- a/crates/loro-internal/src/loro.rs +++ b/crates/loro-internal/src/loro.rs @@ -70,11 +70,13 @@ impl LoroDoc { } /// Is the document empty? (no ops) + #[inline(always)] pub fn is_empty(&self) -> bool { self.oplog.lock().unwrap().is_empty() && self.state.lock().unwrap().is_empty() } /// Whether [OpLog] ans [DocState] are detached. + #[inline(always)] pub fn is_detached(&self) -> bool { self.detached } @@ -92,18 +94,22 @@ impl LoroDoc { } } + #[inline(always)] pub fn peer_id(&self) -> PeerID { self.state.lock().unwrap().peer } + #[inline(always)] pub fn set_peer_id(&self, peer: PeerID) { self.state.lock().unwrap().peer = peer; } + #[inline(always)] pub fn detach(&mut self) { self.detached = true; } + #[inline(always)] pub fn attach(&mut self) { self.checkout_to_latest() } @@ -162,6 +168,7 @@ impl LoroDoc { Ok(txn) } + #[inline(always)] pub fn app_state(&self) -> &Arc> { &self.state } diff --git a/crates/loro-internal/src/oplog.rs b/crates/loro-internal/src/oplog.rs index dd72b815..406947cf 100644 --- a/crates/loro-internal/src/oplog.rs +++ b/crates/loro-internal/src/oplog.rs @@ -476,10 +476,12 @@ impl OpLog { .and_then(|change| change.ops.get_by_atom_index(id.counter).map(|x| x.element)) } + #[inline(always)] pub fn export_from(&self, vv: &VersionVector) -> Vec { encode_oplog(self, EncodeMode::Auto(vv.clone())) } + #[inline(always)] pub fn decode(&mut self, data: &[u8]) -> Result<(), LoroError> { decode_oplog(self, data) }