Skip to content

Commit c6db4bc

Browse files
committed
Add bench for backtracking
1 parent 1f3baca commit c6db4bc

8 files changed

+49243
-4
lines changed

Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ include = ["Cargo.toml", "LICENSE", "README.md", "src/**", "tests/**", "examples
2424

2525
[dependencies]
2626
indexmap = "2.6.0"
27-
log = "0.4.22" # for debug logs in tests
27+
# for debug logs in tests
28+
log = "0.4.22"
2829
priority-queue = "2.1.1"
2930
rustc-hash = ">=1.0.0, <3.0.0"
3031
serde = { version = "1.0", features = ["derive"], optional = true }
@@ -42,6 +43,10 @@ version-ranges = { version = "0.1.0", path = "version-ranges", features = ["prop
4243
[features]
4344
serde = ["dep:serde", "version-ranges/serde"]
4445

46+
[[bench]]
47+
name = "backtracking"
48+
harness = false
49+
4550
[[bench]]
4651
name = "large_case"
4752
harness = false

benches/backtracking.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// SPDX-License-Identifier: MPL-2.0
2+
3+
use std::collections::BTreeMap;
4+
use std::time::Duration;
5+
6+
use criterion::*;
7+
use pubgrub::OfflineDependencyProvider;
8+
use version_ranges::Ranges;
9+
10+
type Deps = BTreeMap<u32, BTreeMap<u8, BTreeMap<u32, Vec<(u8, u8)>>>>;
11+
12+
fn bench(b: &mut Bencher, data: &str) {
13+
let dependencies = ron::de::from_str::<Deps>(data).unwrap();
14+
15+
let mut dependency_provider = OfflineDependencyProvider::<u32, Ranges<u8>>::new();
16+
17+
for (&p, vmap) in &dependencies {
18+
for (&v, dmap) in vmap {
19+
let deps_iter = dmap.iter().map(|(&d, intervals)| {
20+
let mut r = Ranges::empty();
21+
for &(start, end) in intervals {
22+
r = r.r#union(&Ranges::from_range_bounds(start..=end));
23+
}
24+
(d, r)
25+
});
26+
dependency_provider.add_dependencies(p, v, deps_iter);
27+
}
28+
}
29+
30+
if let Some((p, v)) = dependencies
31+
.first_key_value()
32+
.and_then(|(&p, vmap)| vmap.first_key_value().map(|(&v, _)| (p, v)))
33+
{
34+
b.iter(|| {
35+
let _ = pubgrub::resolve(&dependency_provider, p, v);
36+
});
37+
}
38+
}
39+
40+
fn bench_group(c: &mut Criterion) {
41+
let mut group = c.benchmark_group("bench");
42+
group.measurement_time(Duration::from_secs(20));
43+
44+
for case in ["small", "medium", "large"] {
45+
let name = format!("backtracking_{case}");
46+
let data = std::fs::read_to_string(format!("test-examples/{name}.ron")).unwrap();
47+
group.bench_function(name, |b| {
48+
bench(b, &data);
49+
});
50+
}
51+
52+
group.finish();
53+
}
54+
55+
criterion_group!(benches, bench_group);
56+
criterion_main!(benches);

benches/large_case.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// SPDX-License-Identifier: MPL-2.0
2+
23
use std::time::Duration;
34

45
use criterion::*;

benches/sudoku.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<Arc<usize>>)> {
5656
if let Some(val) = val.chars().next().unwrap().to_digit(10) {
5757
out.push((
5858
SudokuPackage::Cell {
59-
row: (row + 1).try_into().unwrap(),
60-
col: (col + 1).try_into().unwrap(),
59+
row: row + 1,
60+
col: col + 1,
6161
},
6262
Range::singleton(val as usize),
6363
));

0 commit comments

Comments
 (0)