-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgraph_walking.rs
58 lines (45 loc) · 1.29 KB
/
graph_walking.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use crepe::crepe;
const MAX_PATH_LEN: u32 = 50;
crepe! {
@input
struct Edge(i32, i32, u32);
@output
struct Walk(i32, i32, u32);
@output
struct NoWalk(i32, i32);
struct Node(i32);
Node(x) <- Edge(x, _, _);
Node(x) <- Edge(_, x, _);
Walk(x, x, 0) <- Node(x);
Walk(x, z, len1 + len2) <-
Edge(x, y, len1),
Walk(y, z, len2),
(len1 + len2 <= MAX_PATH_LEN);
NoWalk(x, y) <- Node(x), Node(y), !Walk(x, y, _);
}
fn walk(n: usize) -> (usize, usize) {
let n = n as i32;
let mut edges = Vec::new();
for i in 0..n {
for j in 0..n {
if (i + j) % 50 < 2 {
edges.push(Edge(i, j, 5));
}
}
}
let mut runtime = Crepe::new();
runtime.extend(edges);
let (walk, nowalk) = runtime.run_with_hasher::<fnv::FnvBuildHasher>();
(walk.len(), nowalk.len())
}
fn criterion_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("walk");
for n in [128, 256, 512] {
group.bench_with_input(BenchmarkId::from_parameter(n), &n, |b, &n| {
b.iter(|| walk(black_box(n)));
});
}
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);