graph_api_benches/
scale.rs1use crate::generators::{GraphSize, generate_random_graph};
2use crate::{Edge, Vertex};
3use criterion::{BenchmarkGroup, Throughput, measurement::WallTime};
4use graph_api_lib::{EdgeSearch, Graph, VertexSearch};
5
6pub fn run_benchmarks<G: Graph<Vertex = Vertex, Edge = Edge>>(
8 group: &mut BenchmarkGroup<WallTime>,
9 setup: impl Fn() -> G + Clone,
10) {
11 bench_scale_vertex_count(group, setup.clone());
12 bench_scale_edge_traversal(group, setup.clone());
13}
14
15fn bench_scale_vertex_count<G: Graph<Vertex = Vertex, Edge = Edge>>(
17 group: &mut BenchmarkGroup<WallTime>,
18 setup: impl Fn() -> G + Clone,
19) {
20 for size in &[
22 GraphSize::Small,
23 GraphSize::Medium,
24 GraphSize::Large,
25 GraphSize::Huge,
26 ] {
27 let vertex_count = size.vertex_count();
28
29 group.throughput(Throughput::Elements(vertex_count as u64));
30 group.bench_function(format!("scale_vertex_count_{}", vertex_count), |b| {
31 let mut graph = setup();
33 generate_random_graph(&mut graph, *size, 42);
34
35 b.iter(|| {
36 graph.walk().vertices(VertexSearch::scan()).count()
38 })
39 });
40 }
41}
42
43fn bench_scale_edge_traversal<G: Graph<Vertex = Vertex, Edge = Edge>>(
45 group: &mut BenchmarkGroup<WallTime>,
46 setup: impl Fn() -> G + Clone,
47) {
48 for size in &[GraphSize::Small, GraphSize::Medium] {
50 let vertex_count = size.vertex_count();
51
52 group.throughput(Throughput::Elements(vertex_count as u64));
53 group.bench_function(format!("scale_edge_traversal_{}", vertex_count), |b| {
54 let mut graph = setup();
56 let vertex_ids = generate_random_graph(&mut graph, *size, 42);
57 let start_id = vertex_ids[0]; b.iter(|| {
60 graph
62 .walk()
63 .vertices_by_id(vec![start_id])
64 .edges(EdgeSearch::scan())
65 .head()
66 .collect::<Vec<_>>()
67 })
68 });
69 }
70}