graph_api_benches/
vertex.rs1use 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
7pub 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
19fn 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
42fn 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 let mut graph = setup();
51 let refs = generate_test_graph(&mut graph);
52
53 b.iter(|| graph.vertex(refs.bryn))
54 });
55}
56
57fn 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 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
77fn 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 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
95fn 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 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}