graph_api_benches/
vertex.rs

1use crate::generators::{GraphSize, generate_random_graph, generate_test_graph};
2use criterion::{BenchmarkGroup, Throughput, measurement::WallTime};
3use graph_api_lib::{Graph, VertexReference, VertexReferenceMut};
4use graph_api_test::{Edge, Person, PersonMut, Vertex};
5use uuid::Uuid;
6
7/// Run all vertex operation benchmarks
8pub fn run_benchmarks<G: Graph<Vertex = Vertex, Edge = Edge>>(
9    group: &mut BenchmarkGroup<WallTime>,
10    setup: impl Fn() -> G + Clone,
11) {
12    bench_vertex_add(group, setup.clone());
13    bench_vertex_retrieve(group, setup.clone());
14    bench_vertex_remove(group, setup.clone());
15    bench_vertex_property_access(group, setup.clone());
16    bench_vertex_property_update(group, setup.clone());
17}
18
19/// Benchmark adding a vertex
20fn bench_vertex_add<G: Graph<Vertex = Vertex, Edge = Edge>>(
21    group: &mut BenchmarkGroup<WallTime>,
22    setup: impl Fn() -> G + Clone,
23) {
24    group.throughput(Throughput::Elements(1));
25    group.bench_function("vertex_add", |b| {
26        b.iter_batched(
27            &setup,
28            |mut graph| {
29                graph.add_vertex(Vertex::Person {
30                    name: "Benchmark Person".to_string(),
31                    age: 30,
32                    unique_id: Uuid::new_v4(),
33                    username: "benchmark_user".to_string(),
34                    biography: "Created for benchmarking".to_string(),
35                })
36            },
37            criterion::BatchSize::SmallInput,
38        )
39    });
40}
41
42/// Benchmark retrieving a vertex by ID
43fn bench_vertex_retrieve<G: Graph<Vertex = Vertex, Edge = Edge>>(
44    group: &mut BenchmarkGroup<WallTime>,
45    setup: impl Fn() -> G + Clone,
46) {
47    group.throughput(Throughput::Elements(1));
48    group.bench_function("vertex_retrieve", |b| {
49        // Setup: Create graph with test data
50        let mut graph = setup();
51        let refs = generate_test_graph(&mut graph);
52
53        b.iter(|| graph.vertex(refs.bryn))
54    });
55}
56
57/// Benchmark removing a vertex
58fn bench_vertex_remove<G: Graph<Vertex = Vertex, Edge = Edge>>(
59    group: &mut BenchmarkGroup<WallTime>,
60    setup: impl Fn() -> G + Clone,
61) {
62    group.throughput(Throughput::Elements(1));
63    group.bench_function("vertex_remove", |b| {
64        b.iter_batched(
65            || {
66                // Setup: Create graph with random data
67                let mut graph = setup();
68                let vertex_ids = generate_random_graph(&mut graph, GraphSize::Small, 42);
69                (graph, vertex_ids.first().cloned().unwrap())
70            },
71            |(mut graph, vertex_id)| graph.remove_vertex(vertex_id),
72            criterion::BatchSize::SmallInput,
73        )
74    });
75}
76
77/// Benchmark accessing vertex properties
78fn bench_vertex_property_access<G: Graph<Vertex = Vertex, Edge = Edge>>(
79    group: &mut BenchmarkGroup<WallTime>,
80    setup: impl Fn() -> G + Clone,
81) {
82    group.throughput(Throughput::Elements(1));
83    group.bench_function("vertex_property_access", |b| {
84        // Setup: Create graph with test data
85        let mut graph = setup();
86        let refs = generate_test_graph(&mut graph);
87
88        b.iter(|| {
89            let vertex = graph.vertex(refs.bryn).unwrap();
90            vertex.project::<Person<_>>().expect("person").name();
91        })
92    });
93}
94
95/// Benchmark updating vertex properties
96fn bench_vertex_property_update<G: Graph<Vertex = Vertex, Edge = Edge>>(
97    group: &mut BenchmarkGroup<WallTime>,
98    setup: impl Fn() -> G + Clone,
99) {
100    group.throughput(Throughput::Elements(1));
101    group.bench_function("vertex_property_update", |b| {
102        b.iter_batched(
103            || {
104                // Setup: Create graph with test data
105                let mut graph = setup();
106                let refs = generate_test_graph(&mut graph);
107                (graph, refs.bryn)
108            },
109            |(mut graph, vertex_id)| {
110                let mut vertex = graph.vertex_mut(vertex_id).unwrap();
111                let mut person = vertex.project_mut::<PersonMut<_, _>>().expect("person");
112                person.set_age(100);
113            },
114            criterion::BatchSize::SmallInput,
115        )
116    });
117}