2024-08-17 11:04:11 +00:00
|
|
|
use dev_utils::ByteSize;
|
|
|
|
use loro::LoroDoc;
|
2024-09-11 14:53:10 +00:00
|
|
|
use std::time::Instant;
|
2024-08-17 11:04:11 +00:00
|
|
|
|
|
|
|
pub fn bench_fast_snapshot(doc: &LoroDoc) {
|
2024-08-17 14:00:39 +00:00
|
|
|
let old_v;
|
2024-08-17 11:04:11 +00:00
|
|
|
{
|
|
|
|
println!("======== Old snapshot mode =========");
|
|
|
|
let start = Instant::now();
|
|
|
|
let snapshot = doc.export_snapshot();
|
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Snapshot size: {}", ByteSize(snapshot.len()));
|
|
|
|
println!("Export snapshot time: {:?}", elapsed);
|
2024-08-17 13:16:44 +00:00
|
|
|
let start = Instant::now();
|
|
|
|
let compressed = zstd::encode_all(snapshot.as_slice(), 0).unwrap();
|
|
|
|
println!(
|
|
|
|
"Snapshot size after compression: {}",
|
|
|
|
ByteSize(compressed.len())
|
|
|
|
);
|
|
|
|
println!("Snapshot compression time: {:?}", start.elapsed());
|
2024-08-17 11:04:11 +00:00
|
|
|
|
|
|
|
let start = Instant::now();
|
2024-08-17 14:00:39 +00:00
|
|
|
let mem = dev_utils::get_mem_usage();
|
2024-08-17 11:04:11 +00:00
|
|
|
let doc = LoroDoc::new();
|
|
|
|
doc.import(&snapshot).unwrap();
|
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Import snapshot time: {:?}", elapsed);
|
2024-08-17 14:00:39 +00:00
|
|
|
println!(
|
|
|
|
"Memory usage for new doc: {}",
|
|
|
|
dev_utils::get_mem_usage() - mem
|
|
|
|
);
|
|
|
|
|
|
|
|
let start = Instant::now();
|
|
|
|
old_v = doc.get_deep_value();
|
|
|
|
println!("Get deep value time: {:?}", start.elapsed());
|
2024-08-17 11:04:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
println!("======== New snapshot mode =========");
|
|
|
|
let start = Instant::now();
|
2024-10-02 03:11:08 +00:00
|
|
|
let snapshot = doc.export(loro::ExportMode::Snapshot).unwrap();
|
2024-08-17 11:04:11 +00:00
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Fast Snapshot size: {}", ByteSize(snapshot.len()));
|
|
|
|
println!("Export fast snapshot time: {:?}", elapsed);
|
2024-08-17 13:16:44 +00:00
|
|
|
let start = Instant::now();
|
|
|
|
let compressed = zstd::encode_all(snapshot.as_slice(), 0).unwrap();
|
|
|
|
println!(
|
|
|
|
"Snapshot size after compression: {}",
|
|
|
|
ByteSize(compressed.len())
|
|
|
|
);
|
|
|
|
println!("Snapshot compression time: {:?}", start.elapsed());
|
2024-08-17 11:04:11 +00:00
|
|
|
|
|
|
|
let mem = dev_utils::get_mem_usage();
|
2024-09-04 13:00:17 +00:00
|
|
|
let new_doc = LoroDoc::new();
|
|
|
|
let start = Instant::now();
|
|
|
|
new_doc.import(&snapshot).unwrap();
|
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Import fast snapshot time: {:?}", elapsed);
|
|
|
|
println!(
|
|
|
|
"Memory usage for new doc: {}",
|
|
|
|
dev_utils::get_mem_usage() - mem
|
|
|
|
);
|
|
|
|
let start = Instant::now();
|
|
|
|
let v = new_doc.get_deep_value();
|
|
|
|
println!("Get deep value time: {:?}", start.elapsed());
|
|
|
|
assert_eq!(v, old_v);
|
|
|
|
println!(
|
|
|
|
"Memory usage for new doc after getting deep value: {}",
|
|
|
|
dev_utils::get_mem_usage() - mem
|
|
|
|
);
|
|
|
|
|
|
|
|
let start = Instant::now();
|
2024-09-11 15:34:05 +00:00
|
|
|
let _snapshot = new_doc.export(loro::ExportMode::Snapshot);
|
2024-09-04 13:00:17 +00:00
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!(
|
|
|
|
"Export fast snapshot time (from doc created by fast snapshot): {:?}",
|
|
|
|
elapsed
|
|
|
|
);
|
2024-08-17 15:32:09 +00:00
|
|
|
|
2024-09-04 13:00:17 +00:00
|
|
|
// let start = Instant::now();
|
|
|
|
// new_doc.check_state_correctness_slow();
|
|
|
|
// println!("Check state correctness duration: {:?}", start.elapsed());
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
println!("======== New snapshot mode with GC =========");
|
|
|
|
let start = Instant::now();
|
2024-10-02 03:11:08 +00:00
|
|
|
let snapshot = doc
|
2024-10-08 05:15:14 +00:00
|
|
|
.export(loro::ExportMode::shallow_snapshot(&doc.oplog_frontiers()))
|
2024-10-02 03:11:08 +00:00
|
|
|
.unwrap();
|
2024-09-04 13:00:17 +00:00
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Fast Snapshot size: {}", ByteSize(snapshot.len()));
|
|
|
|
println!("Export fast snapshot time: {:?}", elapsed);
|
|
|
|
let start = Instant::now();
|
|
|
|
let compressed = zstd::encode_all(snapshot.as_slice(), 0).unwrap();
|
|
|
|
println!(
|
|
|
|
"Snapshot size after compression: {}",
|
|
|
|
ByteSize(compressed.len())
|
|
|
|
);
|
|
|
|
println!("Snapshot compression time: {:?}", start.elapsed());
|
|
|
|
|
|
|
|
let mem = dev_utils::get_mem_usage();
|
|
|
|
let new_doc = LoroDoc::new();
|
|
|
|
let start = Instant::now();
|
|
|
|
new_doc.import(&snapshot).unwrap();
|
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!("Import fast snapshot with GC time: {:?}", elapsed);
|
|
|
|
println!(
|
|
|
|
"Memory usage for new doc: {}",
|
|
|
|
dev_utils::get_mem_usage() - mem
|
|
|
|
);
|
2024-08-17 14:00:39 +00:00
|
|
|
|
|
|
|
let start = Instant::now();
|
|
|
|
let v = new_doc.get_deep_value();
|
|
|
|
println!("Get deep value time: {:?}", start.elapsed());
|
|
|
|
assert_eq!(v, old_v);
|
2024-08-17 11:04:11 +00:00
|
|
|
println!(
|
|
|
|
"Memory usage for new doc after getting deep value: {}",
|
|
|
|
dev_utils::get_mem_usage() - mem
|
|
|
|
);
|
2024-08-17 14:17:04 +00:00
|
|
|
|
|
|
|
let start = Instant::now();
|
2024-09-11 15:34:05 +00:00
|
|
|
let _snapshot = new_doc.export(loro::ExportMode::Snapshot);
|
2024-08-17 14:17:04 +00:00
|
|
|
let elapsed = start.elapsed();
|
|
|
|
println!(
|
|
|
|
"Export fast snapshot time (from doc created by fast snapshot): {:?}",
|
|
|
|
elapsed
|
|
|
|
);
|
|
|
|
|
2024-08-17 15:32:09 +00:00
|
|
|
// let start = Instant::now();
|
|
|
|
// new_doc.check_state_correctness_slow();
|
|
|
|
// println!("Check state correctness duration: {:?}", start.elapsed());
|
2024-08-17 11:04:11 +00:00
|
|
|
}
|
|
|
|
}
|