Skip to content

Commit 0c1c677

Browse files
committed
add mutation testing to size and time benchmarks
1 parent d7ba2b9 commit 0c1c677

File tree

3 files changed

+567
-37
lines changed

3 files changed

+567
-37
lines changed

benchmarks/Cargo.toml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ edition = "2021"
99
assert_unordered = "0.3.5"
1010
structdiff = { path = "..", features = ["serde", "debug_diffs"] }
1111
nanorand = { version = "0.7.0" }
12-
diff-struct = { version = "0.5.1", optional = true}
12+
diff-struct = { version = "0.5.3", optional = true}
1313
serde = { version = "^1.0.0", features = ["derive"] }
1414
serde-diff = { version = "0.4.1", optional = true}
1515
bincode = { version = "1.3.3" }
@@ -19,6 +19,11 @@ criterion = "0.5.1"
1919
default = ["compare"]
2020
compare = ["dep:serde-diff", "dep:diff-struct"]
2121

22+
[profile.release]
23+
lto = "fat"
24+
opt-level = 3
25+
debug = true
26+
2227
[profile.bench]
2328
lto = "fat"
2429
opt-level = 3
@@ -31,3 +36,8 @@ harness = false
3136
[[bench]]
3237
name = "large"
3338
harness = false
39+
40+
[[bench]]
41+
name = "basic_mutate"
42+
harness = false
43+

benchmarks/benches/basic_mutate.rs

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#![cfg(test)]
2+
3+
extern crate structdiff_benchmarks;
4+
5+
use std::time::Duration;
6+
7+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
8+
use nanorand::WyRand;
9+
use structdiff::StructDiff;
10+
use structdiff_benchmarks::TestBench;
11+
const SAMPLE_SIZE: usize = 1000;
12+
const MEASUREMENT_TIME: Duration = Duration::from_secs(25);
13+
const SEED: u64 = 42;
14+
15+
#[cfg(feature = "compare")]
16+
criterion_group!(
17+
benches,
18+
bench_basic_mutate_generation,
19+
bench_basic_mutate_full,
20+
diff_struct_bench::bench_basic_mutate,
21+
serde_diff_bench::bench_basic_mutate
22+
);
23+
#[cfg(not(feature = "compare"))]
24+
criterion_group!(
25+
benches,
26+
bench_basic_mutate_generation,
27+
bench_basic_mutate_full
28+
);
29+
30+
criterion_main!(benches);
31+
32+
fn bench_basic_mutate_generation(c: &mut Criterion) {
33+
const GROUP_NAME: &str = "bench_basic_mutate_ref_gen";
34+
let mut rng = WyRand::new_seed(SEED);
35+
let first = black_box(TestBench::generate_random(&mut rng));
36+
let second = black_box(first.clone().random_mutate(&mut rng));
37+
let mut group = c.benchmark_group(GROUP_NAME);
38+
group
39+
.sample_size(SAMPLE_SIZE)
40+
.measurement_time(MEASUREMENT_TIME);
41+
group.bench_function(GROUP_NAME, |b| {
42+
b.iter(|| {
43+
black_box(StructDiff::diff_ref(&first, &second));
44+
})
45+
});
46+
group.finish();
47+
}
48+
49+
fn bench_basic_mutate_full(c: &mut Criterion) {
50+
const GROUP_NAME: &str = "bench_basic_mutate_owned";
51+
let mut rng = WyRand::new_seed(SEED);
52+
let mut first = black_box(TestBench::generate_random(&mut rng));
53+
let second = black_box(first.clone().random_mutate(&mut rng));
54+
let mut group = c.benchmark_group(GROUP_NAME);
55+
group
56+
.sample_size(SAMPLE_SIZE)
57+
.measurement_time(MEASUREMENT_TIME);
58+
group.bench_function(GROUP_NAME, |b| {
59+
b.iter(|| {
60+
let diff = black_box(StructDiff::diff(&first, &second));
61+
black_box(first.apply_mut(diff));
62+
})
63+
});
64+
group.finish();
65+
}
66+
67+
#[cfg(feature = "compare")]
68+
mod diff_struct_bench {
69+
use super::{black_box, Criterion, TestBench, WyRand, MEASUREMENT_TIME, SAMPLE_SIZE, SEED};
70+
use diff::Diff;
71+
72+
pub(super) fn bench_basic_mutate(c: &mut Criterion) {
73+
const GROUP_NAME: &str = "diff_struct_bench_basic_mutate";
74+
let mut rng = WyRand::new_seed(SEED);
75+
let mut first = black_box(TestBench::generate_random(&mut rng));
76+
let second = black_box(first.clone().random_mutate(&mut rng));
77+
let mut group = c.benchmark_group(GROUP_NAME);
78+
group
79+
.sample_size(SAMPLE_SIZE)
80+
.measurement_time(MEASUREMENT_TIME);
81+
group.bench_function(GROUP_NAME, |b| {
82+
b.iter(|| {
83+
let diff = black_box(Diff::diff(&first, &second));
84+
black_box(Diff::apply(&mut first, &diff))
85+
})
86+
});
87+
group.finish();
88+
assert_eq!(first.b, second.b);
89+
}
90+
}
91+
92+
#[cfg(feature = "compare")]
93+
mod serde_diff_bench {
94+
use super::{black_box, Criterion, TestBench, WyRand, MEASUREMENT_TIME, SAMPLE_SIZE, SEED};
95+
use bincode::Options;
96+
97+
pub(super) fn bench_basic_mutate(c: &mut Criterion) {
98+
const GROUP_NAME: &str = "serde_diff_bench_basic_mutate";
99+
let mut rng = WyRand::new_seed(SEED);
100+
let mut first = black_box(TestBench::generate_random(&mut rng));
101+
let second = black_box(first.clone().random_mutate(&mut rng));
102+
let options = bincode::DefaultOptions::new()
103+
.with_fixint_encoding()
104+
.allow_trailing_bytes();
105+
let mut group = c.benchmark_group(GROUP_NAME);
106+
group
107+
.sample_size(SAMPLE_SIZE)
108+
.measurement_time(MEASUREMENT_TIME);
109+
group.bench_function(GROUP_NAME, |b| {
110+
b.iter(|| {
111+
let mut diff = black_box(
112+
options
113+
.serialize(&serde_diff::Diff::serializable(&first, &second))
114+
.unwrap(),
115+
);
116+
let mut deserializer =
117+
black_box(bincode::Deserializer::from_slice(&mut diff[..], options));
118+
serde_diff::Apply::apply(&mut deserializer, &mut first).unwrap();
119+
})
120+
});
121+
group.finish();
122+
assert_eq!(first.b, second.b);
123+
}
124+
}

0 commit comments

Comments
 (0)