Skip to content

Commit cc1a9dc

Browse files
committed
Add bench for backtracking
1 parent 51d38dd commit cc1a9dc

File tree

5 files changed

+95
-4
lines changed

5 files changed

+95
-4
lines changed

Cargo.toml

+6-1
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

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// SPDX-License-Identifier: MPL-2.0
2+
3+
//! This bench monitors the performance of backtracking and term intersection.
4+
//!
5+
//! Dependencies are constructed in a way that all versions need to be tested before finding a solution.
6+
7+
use criterion::*;
8+
use pubgrub::OfflineDependencyProvider;
9+
use version_ranges::Ranges;
10+
11+
fn backtracking_singletons(c: &mut Criterion, package_count: u32, version_count: u32) {
12+
let mut dependency_provider = OfflineDependencyProvider::<u32, Ranges<u32>>::new();
13+
14+
dependency_provider.add_dependencies(0u32, 0u32, [(1u32, Ranges::full())]);
15+
dependency_provider.add_dependencies(1u32, 0u32, []);
16+
17+
for n in 1..package_count {
18+
for v in 1..version_count {
19+
dependency_provider.add_dependencies(n, v, [(n + 1, Ranges::singleton(v))]);
20+
}
21+
}
22+
23+
c.bench_function("backtracking_singletons", |b| {
24+
b.iter(|| {
25+
let _ = pubgrub::resolve(&dependency_provider, 0u32, 0u32);
26+
})
27+
});
28+
}
29+
30+
fn backtracking_disjoint_versions(c: &mut Criterion, package_count: u32, version_count: u32) {
31+
let mut dependency_provider = OfflineDependencyProvider::<u32, Ranges<u32>>::new();
32+
33+
let root_deps = [(1u32, Ranges::full()), (u32::MAX, Ranges::singleton(0u32))];
34+
dependency_provider.add_dependencies(0u32, 0u32, root_deps);
35+
36+
dependency_provider.add_dependencies(1u32, 0u32, []);
37+
38+
for n in 1..package_count {
39+
for v in 1..version_count {
40+
dependency_provider.add_dependencies(n, v, [(n + 1, Ranges::singleton(v))]);
41+
}
42+
}
43+
for v in 1..version_count {
44+
dependency_provider.add_dependencies(package_count, v, [(u32::MAX, Ranges::singleton(v))]);
45+
}
46+
47+
for v in 0..version_count {
48+
dependency_provider.add_dependencies(u32::MAX, v, []);
49+
}
50+
51+
c.bench_function("backtracking_disjoint_versions", |b| {
52+
b.iter(|| {
53+
let _ = pubgrub::resolve(&dependency_provider, 0u32, 0u32);
54+
})
55+
});
56+
}
57+
58+
fn backtracking_ranges(c: &mut Criterion, package_count: u32, version_count: u32) {
59+
let mut dependency_provider = OfflineDependencyProvider::<u32, Ranges<u32>>::new();
60+
61+
dependency_provider.add_dependencies(0u32, 0u32, [(1u32, Ranges::full())]);
62+
dependency_provider.add_dependencies(1u32, 0u32, []);
63+
64+
for n in 1..package_count {
65+
for v in 1..version_count {
66+
let r = Ranges::higher_than(version_count - v);
67+
dependency_provider.add_dependencies(n, v, [(n + 1, r)]);
68+
}
69+
}
70+
71+
c.bench_function("backtracking_ranges", |b| {
72+
b.iter(|| {
73+
let _ = pubgrub::resolve(&dependency_provider, 0u32, 0u32);
74+
})
75+
});
76+
}
77+
78+
fn bench_group(c: &mut Criterion) {
79+
backtracking_singletons(c, 100, 500);
80+
backtracking_disjoint_versions(c, 300, 200);
81+
backtracking_ranges(c, 5, 200);
82+
}
83+
84+
criterion_group!(benches, bench_group);
85+
criterion_main!(benches);

benches/large_case.rs

+1
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

+2-2
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
));

test-examples/large_case_u16_NumberVersion.ron

+1-1
Original file line numberDiff line numberDiff line change
@@ -5521,4 +5521,4 @@
55215521
18: {},
55225522
19: {},
55235523
},
5524-
}
5524+
}

0 commit comments

Comments
 (0)