graph_api_benches/
vertex.rs

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