automerge/rust/automerge/benches/map.rs
Alex Good dd3c6d1303
Move rust workspace into ./rust
After some discussion with PVH I realise that the repo structure in the
last reorg was very rust-centric. In an attempt to put each language on
a level footing move the rust code and project files into ./rust
2022-10-16 19:55:51 +01:00

268 lines
8.4 KiB
Rust

use automerge::{transaction::Transactable, Automerge, ScalarValue, ROOT};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
fn repeated_increment(n: u64) -> Automerge {
let mut doc = Automerge::new();
let mut tx = doc.transaction();
tx.put(ROOT, "counter", ScalarValue::counter(0)).unwrap();
for _ in 0..n {
tx.increment(ROOT, "counter", 1).unwrap();
}
tx.commit();
doc
}
fn repeated_put(n: u64) -> Automerge {
let mut doc = Automerge::new();
let mut tx = doc.transaction();
for i in 0..n {
tx.put(ROOT, "0", i).unwrap();
}
tx.commit();
doc
}
fn increasing_put(n: u64) -> Automerge {
let mut doc = Automerge::new();
let mut tx = doc.transaction();
for i in 0..n {
tx.put(ROOT, i.to_string(), i).unwrap();
}
tx.commit();
doc
}
fn decreasing_put(n: u64) -> Automerge {
let mut doc = Automerge::new();
let mut tx = doc.transaction();
for i in (0..n).rev() {
tx.put(ROOT, i.to_string(), i).unwrap();
}
tx.commit();
doc
}
fn criterion_benchmark(c: &mut Criterion) {
let sizes = [100, 1_000, 10_000];
let mut group = c.benchmark_group("map");
for size in &sizes {
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| {
b.iter(|| repeated_put(size))
});
group.bench_with_input(
BenchmarkId::new("repeated increment", size),
size,
|b, &size| b.iter(|| repeated_increment(size)),
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("increasing put", size),
size,
|b, &size| b.iter(|| increasing_put(size)),
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("decreasing put", size),
size,
|b, &size| b.iter(|| decreasing_put(size)),
);
}
group.finish();
let mut group = c.benchmark_group("map save");
for size in &sizes {
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| {
b.iter_batched(
|| repeated_put(size),
|mut doc| doc.save(),
criterion::BatchSize::LargeInput,
)
});
group.bench_with_input(
BenchmarkId::new("repeated increment", size),
size,
|b, &size| {
b.iter_batched(
|| repeated_increment(size),
|mut doc| doc.save(),
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("increasing put", size),
size,
|b, &size| {
b.iter_batched(
|| increasing_put(size),
|mut doc| doc.save(),
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("decreasing put", size),
size,
|b, &size| {
b.iter_batched(
|| decreasing_put(size),
|mut doc| doc.save(),
criterion::BatchSize::LargeInput,
)
},
);
}
group.finish();
let mut group = c.benchmark_group("map load");
for size in &sizes {
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| {
b.iter_batched(
|| repeated_put(size).save(),
|bytes| Automerge::load(&bytes).unwrap(),
criterion::BatchSize::LargeInput,
)
});
group.bench_with_input(
BenchmarkId::new("repeated increment", size),
size,
|b, &size| {
b.iter_batched(
|| repeated_increment(size).save(),
|bytes| Automerge::load(&bytes).unwrap(),
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("increasing put", size),
size,
|b, &size| {
b.iter_batched(
|| increasing_put(size).save(),
|bytes| Automerge::load(&bytes).unwrap(),
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("decreasing put", size),
size,
|b, &size| {
b.iter_batched(
|| decreasing_put(size).save(),
|bytes| Automerge::load(&bytes).unwrap(),
criterion::BatchSize::LargeInput,
)
},
);
}
group.finish();
let mut group = c.benchmark_group("map apply");
for size in &sizes {
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| {
b.iter_batched(
|| {
repeated_put(size)
.get_changes(&[])
.unwrap()
.into_iter()
.cloned()
.collect::<Vec<_>>()
},
|changes| {
let mut doc = Automerge::new();
doc.apply_changes(changes)
},
criterion::BatchSize::LargeInput,
)
});
group.bench_with_input(
BenchmarkId::new("repeated increment", size),
size,
|b, &size| {
b.iter_batched(
|| {
repeated_increment(size)
.get_changes(&[])
.unwrap()
.into_iter()
.cloned()
.collect::<Vec<_>>()
},
|changes| {
let mut doc = Automerge::new();
doc.apply_changes(changes)
},
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("increasing put", size),
size,
|b, &size| {
b.iter_batched(
|| {
increasing_put(size)
.get_changes(&[])
.unwrap()
.into_iter()
.cloned()
.collect::<Vec<_>>()
},
|changes| {
let mut doc = Automerge::new();
doc.apply_changes(changes)
},
criterion::BatchSize::LargeInput,
)
},
);
group.throughput(criterion::Throughput::Elements(*size));
group.bench_with_input(
BenchmarkId::new("decreasing put", size),
size,
|b, &size| {
b.iter_batched(
|| {
decreasing_put(size)
.get_changes(&[])
.unwrap()
.into_iter()
.cloned()
.collect::<Vec<_>>()
},
|changes| {
let mut doc = Automerge::new();
doc.apply_changes(changes)
},
criterion::BatchSize::LargeInput,
)
},
);
}
group.finish();
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);