Skip to content

Commit 9808b01

Browse files
committed
Add bench for backtracking
1 parent cb1a41a commit 9808b01

File tree

5 files changed

+498973
-9
lines changed

5 files changed

+498973
-9
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ version-ranges = { version = "0.1.0", path = "version-ranges", features = ["prop
4242
[features]
4343
serde = ["dep:serde", "version-ranges/serde"]
4444

45+
[[bench]]
46+
name = "bench"
47+
harness = false
48+
4549
[[bench]]
4650
name = "large_case"
4751
harness = false

benches/bench.rs

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

src/provider.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,20 +99,20 @@ impl<P: Debug + Display + Clone + Eq + Hash, VS: VersionSet> DependencyProvider
9999
.and_then(|versions| versions.keys().rev().find(|v| range.contains(v)).cloned()))
100100
}
101101

102-
type Priority = Reverse<usize>;
102+
type Priority = Reverse<u64>;
103103
fn prioritize(
104104
&mut self,
105105
package: Package,
106106
range: &VS,
107107
package_store: &PackageArena<Self::P>,
108108
) -> Self::Priority {
109-
Reverse(
110-
package_store
111-
.pkg(package)
112-
.and_then(|pkg| self.dependencies.get(pkg))
113-
.map(|versions| versions.keys().filter(|v| range.contains(v)).count())
114-
.unwrap_or(0),
115-
)
109+
let count = package_store
110+
.pkg(package)
111+
.and_then(|pkg| self.dependencies.get(pkg))
112+
.map(|versions| versions.keys().filter(|v| range.contains(v)).count())
113+
.unwrap_or(0);
114+
115+
Reverse(((count as u64) << 32) + package.0 as u64)
116116
}
117117

118118
fn get_dependencies(

0 commit comments

Comments
 (0)