graph_api_benches/
scale.rs

1use crate::generators::{GraphSize, generate_random_graph};
2use crate::{Edge, Vertex};
3use criterion::{BenchmarkGroup, Throughput, measurement::WallTime};
4use graph_api_lib::{EdgeSearch, Graph, VertexSearch};
5
6/// Run all scaling benchmarks
7pub 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
15/// Benchmark how performance scales with vertex count
16fn bench_scale_vertex_count<G: Graph<Vertex = Vertex, Edge = Edge>>(
17    group: &mut BenchmarkGroup<WallTime>,
18    setup: impl Fn() -> G + Clone,
19) {
20    // Test with different graph sizes
21    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            // Setup: Create graph with given size
32            let mut graph = setup();
33            generate_random_graph(&mut graph, *size, 42);
34
35            b.iter(|| {
36                // Count all vertices
37                graph.walk().vertices(VertexSearch::scan()).count()
38            })
39        });
40    }
41}
42
43/// Benchmark how traversal performance scales with edge count
44fn bench_scale_edge_traversal<G: Graph<Vertex = Vertex, Edge = Edge>>(
45    group: &mut BenchmarkGroup<WallTime>,
46    setup: impl Fn() -> G + Clone,
47) {
48    // Test with different graph sizes to see how edge density affects traversal
49    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            // Setup: Create graph with given size
55            let mut graph = setup();
56            let vertex_ids = generate_random_graph(&mut graph, *size, 42);
57            let start_id = vertex_ids[0]; // Start with the first vertex
58
59            b.iter(|| {
60                // Traverse outgoing edges from a vertex
61                graph
62                    .walk()
63                    .vertices_by_id(vec![start_id])
64                    .edges(EdgeSearch::scan())
65                    .head()
66                    .collect::<Vec<_>>()
67            })
68        });
69    }
70}