use crate::generators::{GraphSize, generate_random_graph};
use crate::{Edge, Vertex};
use criterion::{BenchmarkGroup, Throughput, measurement::WallTime};
use graph_api_lib::{EdgeSearch, Graph, VertexSearch};
pub fn run_benchmarks<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
bench_scale_vertex_count(group, setup.clone());
bench_scale_edge_traversal(group, setup.clone());
}
fn bench_scale_vertex_count<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
for size in &[
GraphSize::Small,
GraphSize::Medium,
GraphSize::Large,
GraphSize::Huge,
] {
let vertex_count = size.vertex_count();
group.throughput(Throughput::Elements(vertex_count as u64));
group.bench_function(format!("scale_vertex_count_{}", vertex_count), |b| {
let mut graph = setup();
generate_random_graph(&mut graph, *size, 42);
b.iter(|| {
graph.walk().vertices(VertexSearch::scan()).count()
})
});
}
}
fn bench_scale_edge_traversal<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
for size in &[GraphSize::Small, GraphSize::Medium] {
let vertex_count = size.vertex_count();
group.throughput(Throughput::Elements(vertex_count as u64));
group.bench_function(format!("scale_edge_traversal_{}", vertex_count), |b| {
let mut graph = setup();
let vertex_ids = generate_random_graph(&mut graph, *size, 42);
let start_id = vertex_ids[0];
b.iter(|| {
graph
.walk()
.vertices_by_id(vec![start_id])
.edges(EdgeSearch::scan())
.head()
.collect::<Vec<_>>()
})
});
}
}