use crate::generators::{
GraphSize, generate_project_graph, generate_random_graph, generate_social_graph,
};
use criterion::{BenchmarkGroup, Throughput, measurement::WallTime};
use graph_api_lib::Graph;
use graph_api_test::{Edge, Vertex};
pub fn run_benchmarks<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
bench_construction_small(group, setup.clone());
bench_construction_medium(group, setup.clone());
bench_construction_social(group, setup.clone());
bench_construction_project(group, setup.clone());
bench_construction_batch(group, setup.clone());
}
fn bench_construction_small<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
let size = GraphSize::Small;
let vertex_count = size.vertex_count();
let edge_count = vertex_count * size.edge_multiplier();
group.throughput(Throughput::Elements((vertex_count + edge_count) as u64));
group.bench_function("construction_small", |b| {
b.iter_batched(
&setup,
|mut graph| {
generate_random_graph(&mut graph, size, 42);
},
criterion::BatchSize::SmallInput,
)
});
}
fn bench_construction_medium<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
let size = GraphSize::Medium;
let vertex_count = size.vertex_count();
let edge_count = vertex_count * size.edge_multiplier();
group.throughput(Throughput::Elements((vertex_count + edge_count) as u64));
group.bench_function("construction_medium", |b| {
b.iter_batched(
&setup,
|mut graph| {
generate_random_graph(&mut graph, size, 42);
},
criterion::BatchSize::LargeInput,
)
});
}
fn bench_construction_social<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
let size = GraphSize::Small;
let vertex_count = size.vertex_count();
let edge_count = vertex_count * size.edge_multiplier();
group.throughput(Throughput::Elements((vertex_count + edge_count) as u64));
group.bench_function("construction_social", |b| {
b.iter_batched(
&setup,
|mut graph| {
generate_social_graph(&mut graph, size, 42);
},
criterion::BatchSize::SmallInput,
)
});
}
fn bench_construction_project<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
let size = GraphSize::Small;
let vertex_count = size.vertex_count();
let edge_count = vertex_count * size.edge_multiplier();
group.throughput(Throughput::Elements((vertex_count + edge_count) as u64));
group.bench_function("construction_project", |b| {
b.iter_batched(
&setup,
|mut graph| {
generate_project_graph(&mut graph, size, 42);
},
criterion::BatchSize::SmallInput,
)
});
}
fn bench_construction_batch<G: Graph<Vertex = Vertex, Edge = Edge>>(
group: &mut BenchmarkGroup<WallTime>,
setup: impl Fn() -> G + Clone,
) {
const BATCH_SIZE: usize = 100;
group.throughput(Throughput::Elements(BATCH_SIZE as u64));
group.bench_function("construction_batch_vertex", |b| {
b.iter_batched(
&setup,
|mut graph| {
for i in 0..BATCH_SIZE {
graph.add_vertex(Vertex::Person {
name: format!("BatchPerson-{}", i),
age: 30 + (i % 50) as u64,
unique_id: uuid::Uuid::new_v4(),
username: format!("batch_user_{}", i),
biography: format!("Batch created person {}", i),
});
}
},
criterion::BatchSize::SmallInput,
)
});
}