mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-11 22:58:23 +00:00
perf: speed up find path and common ancestors
This commit is contained in:
parent
58fb7de26c
commit
934b0fdda9
2 changed files with 47 additions and 22 deletions
|
@ -20,29 +20,31 @@ fn main() {
|
||||||
let mut loro = LoroCore::default();
|
let mut loro = LoroCore::default();
|
||||||
let mut loro_b = LoroCore::default();
|
let mut loro_b = LoroCore::default();
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
for txn in txns.unwrap().as_array().unwrap() {
|
for _ in 0..10 {
|
||||||
let mut text = loro.get_or_create_root_text("text").unwrap();
|
for txn in txns.unwrap().as_array().unwrap() {
|
||||||
let patches = txn
|
let mut text = loro.get_or_create_root_text("text").unwrap();
|
||||||
.as_object()
|
let patches = txn
|
||||||
.unwrap()
|
.as_object()
|
||||||
.get("patches")
|
.unwrap()
|
||||||
.unwrap()
|
.get("patches")
|
||||||
.as_array()
|
.unwrap()
|
||||||
.unwrap();
|
.as_array()
|
||||||
for patch in patches {
|
.unwrap();
|
||||||
let pos = patch[0].as_u64().unwrap() as usize;
|
for patch in patches {
|
||||||
let del_here = patch[1].as_u64().unwrap() as usize;
|
let pos = patch[0].as_u64().unwrap() as usize;
|
||||||
let ins_content = patch[2].as_str().unwrap();
|
let del_here = patch[1].as_u64().unwrap() as usize;
|
||||||
text.delete(pos, del_here);
|
let ins_content = patch[2].as_str().unwrap();
|
||||||
text.insert(pos, ins_content);
|
text.delete(pos, del_here);
|
||||||
}
|
text.insert(pos, ins_content);
|
||||||
|
}
|
||||||
|
|
||||||
let a = text.text_len();
|
let a = text.text_len();
|
||||||
drop(text);
|
drop(text);
|
||||||
loro_b.import(loro.export(loro_b.vv()));
|
loro_b.import(loro.export(loro_b.vv()));
|
||||||
let text = loro_b.get_or_create_root_text("text").unwrap();
|
let text = loro_b.get_or_create_root_text("text").unwrap();
|
||||||
let b = text.text_len();
|
let b = text.text_len();
|
||||||
assert_eq!(a, b);
|
assert_eq!(a, b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
loro_b.debug_inspect();
|
loro_b.debug_inspect();
|
||||||
loro.debug_inspect();
|
loro.debug_inspect();
|
||||||
|
|
|
@ -117,6 +117,21 @@ impl<T: Dag + ?Sized> DagUtils for T {
|
||||||
if from.client_id == to.client_id {
|
if from.client_id == to.client_id {
|
||||||
let from_span = self.get(from).unwrap();
|
let from_span = self.get(from).unwrap();
|
||||||
let to_span = self.get(to).unwrap();
|
let to_span = self.get(to).unwrap();
|
||||||
|
if std::ptr::eq(from_span, to_span) {
|
||||||
|
if from.counter < to.counter {
|
||||||
|
ans.right.insert(
|
||||||
|
from.client_id,
|
||||||
|
CounterSpan::new(from.counter + 1, to.counter + 1),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
ans.left.insert(
|
||||||
|
from.client_id,
|
||||||
|
CounterSpan::new(to.counter + 1, from.counter + 1),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
if from_span.deps().len() == 1 && to_span.contains_id(from_span.deps()[0]) {
|
if from_span.deps().len() == 1 && to_span.contains_id(from_span.deps()[0]) {
|
||||||
ans.left.insert(
|
ans.left.insert(
|
||||||
from.client_id,
|
from.client_id,
|
||||||
|
@ -533,6 +548,14 @@ where
|
||||||
if left.client_id == right.client_id {
|
if left.client_id == right.client_id {
|
||||||
let left_span = get(left).unwrap();
|
let left_span = get(left).unwrap();
|
||||||
let right_span = get(right).unwrap();
|
let right_span = get(right).unwrap();
|
||||||
|
if std::ptr::eq(left_span, right_span) {
|
||||||
|
if left.counter < right.counter {
|
||||||
|
return smallvec![left];
|
||||||
|
} else {
|
||||||
|
return smallvec![right];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if left_span.deps().len() == 1 && right_span.contains_id(left_span.deps()[0]) {
|
if left_span.deps().len() == 1 && right_span.contains_id(left_span.deps()[0]) {
|
||||||
return smallvec![right];
|
return smallvec![right];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue