graph_api_benches/
vertex.rs1use 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
9pub 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 #[cfg(feature = "element-removal")]
21 run_removal_benchmarks(group, setup);
22}
23
24#[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
33fn 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
56fn 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 let mut graph = setup();
65 let refs = generate_test_graph(&mut graph);
66
67 b.iter(|| graph.vertex(refs.bryn))
68 });
69}
70
71#[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 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
92fn 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 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
110fn 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 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}