#[macro_use]
extern crate criterion;
use criterion::Criterion;
use graphlib::*;
fn bench_create(c: &mut Criterion) {
c.bench_function("new", |b| b.iter(|| Graph::<usize>::new()));
c.bench_function("with_capacity_10", |b| {
b.iter(|| Graph::<usize>::with_capacity(10))
});
c.bench_function("with_capacity_100", |b| {
b.iter(|| Graph::<usize>::with_capacity(100))
});
c.bench_function("with_capacity_500", |b| {
b.iter(|| Graph::<usize>::with_capacity(500))
});
c.bench_function("with_capacity_1000", |b| {
b.iter(|| Graph::<usize>::with_capacity(1000))
});
#[cfg(feature = "sbench")]
c.bench_function("with_capacity_m", |b| {
b.iter(|| Graph::<usize>::with_capacity(10_000_000))
});
}
fn bench_iterators(c: &mut Criterion) {
c.bench_function("dfs_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.dfs() {
vertices.push(v);
}
})
});
c.bench_function("dfs_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.dfs() {
vertices.push(v);
}
})
});
c.bench_function("dfs_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.dfs() {
vertices.push(v);
}
})
});
c.bench_function("dfs_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.dfs() {
vertices.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("dfs_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.dfs() {
vertices.push(v);
}
})
});
c.bench_function("bfs_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.bfs() {
vertices.push(v);
}
})
});
c.bench_function("bfs_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.bfs() {
vertices.push(v);
}
})
});
c.bench_function("bfs_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.bfs() {
vertices.push(v);
}
})
});
c.bench_function("bfs_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.bfs() {
vertices.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("bfs_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.bfs() {
vertices.push(v);
}
})
});
c.bench_function("vertices_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
for i in 1..=10 {
graph.add_vertex(i);
}
b.iter(|| {
for v in graph.vertices() {
vertices.push(v);
}
})
});
c.bench_function("vertices_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
for i in 1..=100 {
graph.add_vertex(i);
}
b.iter(|| {
for v in graph.vertices() {
vertices.push(v);
}
})
});
c.bench_function("vertices_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
for i in 1..=500 {
graph.add_vertex(i);
}
b.iter(|| {
for v in graph.vertices() {
vertices.push(v);
}
})
});
c.bench_function("vertices_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
for i in 1..=1000 {
graph.add_vertex(i);
}
b.iter(|| {
for v in graph.vertices() {
vertices.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("vertices_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut vertices = vec![];
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
b.iter(|| {
for v in graph.vertices() {
vertices.push(v);
}
})
});
c.bench_function("roots_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut roots = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.roots() {
roots.push(v);
}
})
});
c.bench_function("roots_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut roots = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.roots() {
roots.push(v);
}
})
});
c.bench_function("roots_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut roots = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.roots() {
roots.push(v);
}
})
});
c.bench_function("roots_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut roots = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.roots() {
roots.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("roots_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut roots = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.roots() {
roots.push(v);
}
})
});
}
fn bench_neighbor_functions(c: &mut Criterion) {
c.bench_function("neighbors_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.neighbors_count(&v1);
})
});
c.bench_function("neighbors_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.neighbors_count(&v1);
})
});
c.bench_function("neighbors_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.neighbors_count(&v1);
})
});
c.bench_function("neighbors_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.neighbors_count(&v1);
})
});
#[cfg(feature = "sbench")]
c.bench_function("neighbors_count_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.neighbors_count(&v1);
})
});
c.bench_function("in_neighbors_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.in_neighbors_count(&v1);
})
});
c.bench_function("in_neighbors_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.in_neighbors_count(&v1);
})
});
c.bench_function("in_neighbors_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.in_neighbors_count(&v1);
})
});
c.bench_function("in_neighbors_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.in_neighbors_count(&v1);
})
});
#[cfg(feature = "sbench")]
c.bench_function("in_neighbors_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.in_neighbors_count(&v1);
})
});
c.bench_function("out_neighbors_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.out_neighbors_count(&v1);
})
});
c.bench_function("out_neighbors_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.out_neighbors_count(&v1);
})
});
c.bench_function("out_neighbors_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.out_neighbors_count(&v1);
})
});
c.bench_function("out_neighbors_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.out_neighbors_count(&v1);
})
});
#[cfg(feature = "sbench")]
c.bench_function("out_neighbors_count_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.out_neighbors_count(&v1);
})
});
c.bench_function("in_neighbors_10", |b| {
let mut neighbors = vec![];
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.in_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("in_neighbors_100", |b| {
let mut neighbors = vec![];
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.in_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("in_neighbors_500", |b| {
let mut neighbors = vec![];
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.in_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("in_neighbors_1000", |b| {
let mut neighbors = vec![];
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.in_neighbors(&v1) {
neighbors.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("in_neighbors_m", |b| {
let mut neighbors = vec![];
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.in_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("out_neighbors_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.out_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("out_neighbors_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.out_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("out_neighbors_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.out_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("out_neighbors_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.out_neighbors(&v1) {
neighbors.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("out_neighbors_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.out_neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("neighbors_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("neighbors_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("neighbors_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.neighbors(&v1) {
neighbors.push(v);
}
})
});
c.bench_function("neighbors_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.neighbors(&v1) {
neighbors.push(v);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("neighbors_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut neighbors = vec![];
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
for v in graph.neighbors(&v1) {
neighbors.push(v);
}
})
});
}
fn bench_others(c: &mut Criterion) {
c.bench_function("add_edge_10", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
})
});
c.bench_function("add_edge_100", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
})
});
c.bench_function("add_edge_500", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
})
});
c.bench_function("add_edge_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("add_edge_m", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
})
});
c.bench_function("add_vertex_10", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=10 {
graph.add_vertex(i);
}
})
});
c.bench_function("add_vertex_100", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=100 {
graph.add_vertex(i);
}
})
});
c.bench_function("add_vertex_500", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=500 {
graph.add_vertex(i);
}
})
});
c.bench_function("add_vertex_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=1000 {
graph.add_vertex(i);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("add_vertex_m", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
})
});
c.bench_function("capacity_10", |b| {
let graph: Graph<usize> = Graph::with_capacity(10);
b.iter(|| {
let _k = graph.capacity();
})
});
c.bench_function("capacity_100", |b| {
let graph: Graph<usize> = Graph::with_capacity(100);
b.iter(|| {
let _k = graph.capacity();
})
});
c.bench_function("capacity_500", |b| {
let graph: Graph<usize> = Graph::with_capacity(500);
b.iter(|| {
let _k = graph.capacity();
})
});
c.bench_function("capacity_1000", |b| {
let graph: Graph<usize> = Graph::with_capacity(1000);
b.iter(|| {
let _k = graph.capacity();
})
});
#[cfg(feature = "sbench")]
c.bench_function("capacity_m", |b| {
let graph: Graph<usize> = Graph::with_capacity(10_000_000);
b.iter(|| {
let _k = graph.capacity();
})
});
c.bench_function("edge_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.edge_count();
})
});
c.bench_function("edge_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.edge_count();
})
});
c.bench_function("edge_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.edge_count();
})
});
c.bench_function("edge_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.edge_count();
})
});
#[cfg(feature = "sbench")]
c.bench_function("edge_count_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.edge_count();
})
});
c.bench_function("fetch_10", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..10 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(10);
b.iter(|| {
let _k = *graph.fetch(&id).unwrap();
})
});
c.bench_function("fetch_100", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..100 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(100);
b.iter(|| {
let _k = *graph.fetch(&id).unwrap();
})
});
c.bench_function("fetch_500", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..500 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(500);
b.iter(|| {
let _k = *graph.fetch(&id).unwrap();
})
});
c.bench_function("fetch_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..1000 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(1000);
b.iter(|| {
let _k = *graph.fetch(&id).unwrap();
})
});
#[cfg(feature = "sbench")]
c.bench_function("fetch_m", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..10_000_000 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(10_000_000);
b.iter(|| {
let _k = *graph.fetch(&id).unwrap();
})
});
c.bench_function("fetch_mut_10", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..10 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(10);
b.iter(|| {
let _v = graph.fetch_mut(&id).unwrap();
})
});
c.bench_function("fetch_mut_100", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..100 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(100);
b.iter(|| {
let _v = graph.fetch_mut(&id).unwrap();
})
});
c.bench_function("fetch_mut_500", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..500 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(500);
b.iter(|| {
let _v = graph.fetch_mut(&id).unwrap();
})
});
c.bench_function("fetch_mut_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..1000 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(1000);
b.iter(|| {
let _v = graph.fetch_mut(&id).unwrap();
})
});
#[cfg(feature = "sbench")]
c.bench_function("fetch_mut_m", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..10_000_000 {
graph.add_vertex(i);
}
let mut id = graph.add_vertex(10_000_000);
b.iter(|| {
let _v = graph.fetch_mut(&id).unwrap();
})
});
c.bench_function("fold_10", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10 {
graph.add_vertex(i);
}
b.iter(|| {
let _result = graph.fold(0, |v, acc| v + acc);
})
});
c.bench_function("fold_100", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=100 {
graph.add_vertex(i);
}
b.iter(|| {
let _result = graph.fold(0, |v, acc| v + acc);
})
});
c.bench_function("fold_500", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=500 {
graph.add_vertex(i);
}
b.iter(|| {
let _result = graph.fold(0, |v, acc| v + acc);
})
});
c.bench_function("fold_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=1000 {
graph.add_vertex(i);
}
b.iter(|| {
let _result = graph.fold(0, |v, acc| v + acc);
})
});
#[cfg(feature = "sbench")]
c.bench_function("fold_m", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
b.iter(|| {
let _result = graph.fold(0, |v, acc| v + acc);
})
});
c.bench_function("has_edge_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let v1 = graph.add_vertex(1);
let v2 = graph.add_vertex(2);
for i in 3..=10 {
graph.add_vertex(i);
}
let v3 = graph.add_vertex(3);
graph.add_edge(&v1, &v2).unwrap();
b.iter(|| {
let _k = graph.has_edge(&v1, &v2);
let _l = graph.has_edge(&v2, &v3);
})
});
c.bench_function("has_edge_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let v1 = graph.add_vertex(1);
let v2 = graph.add_vertex(2);
for i in 3..=100 {
graph.add_vertex(i);
}
let v3 = graph.add_vertex(3);
graph.add_edge(&v1, &v2).unwrap();
b.iter(|| {
let _k = graph.has_edge(&v1, &v2);
let _l = graph.has_edge(&v2, &v3);
})
});
c.bench_function("has_edge_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let v1 = graph.add_vertex(1);
let v2 = graph.add_vertex(2);
for i in 3..=500 {
graph.add_vertex(i);
}
let v3 = graph.add_vertex(3);
graph.add_edge(&v1, &v2).unwrap();
b.iter(|| {
let _k = graph.has_edge(&v1, &v2);
let _l = graph.has_edge(&v2, &v3);
})
});
c.bench_function("has_edge_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let v1 = graph.add_vertex(1);
let v2 = graph.add_vertex(2);
for i in 3..=1000 {
graph.add_vertex(i);
}
let v3 = graph.add_vertex(3);
graph.add_edge(&v1, &v2).unwrap();
b.iter(|| {
let _k = graph.has_edge(&v1, &v2);
let _l = graph.has_edge(&v2, &v3);
})
});
#[cfg(feature = "sbench")]
c.bench_function("has_edge_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let v1 = graph.add_vertex(1);
let v2 = graph.add_vertex(2);
for i in 3..=10_000_000 {
graph.add_vertex(i);
}
let v3 = graph.add_vertex(3);
graph.add_edge(&v1, &v2).unwrap();
b.iter(|| {
let _k = graph.has_edge(&v1, &v2);
let _l = graph.has_edge(&v2, &v3);
})
});
c.bench_function("is_cyclic_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let v0 = graph.add_vertex(0);
let mut v1 = graph.add_vertex(1);
let mut v2 = graph.add_vertex(2);
graph.add_edge(&v0, &v1);
graph.add_edge(&v1, &v2);
for i in 4..=10 {
v1 = v2.clone();
v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
}
graph.add_edge(&v2, &v0);
b.iter(|| {
let _k = graph.is_cyclic();
})
});
c.bench_function("is_cyclic_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let v0 = graph.add_vertex(0);
let mut v1 = graph.add_vertex(1);
let mut v2 = graph.add_vertex(2);
graph.add_edge(&v0, &v1);
graph.add_edge(&v1, &v2);
for i in 4..=100 {
v1 = v2.clone();
v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
}
graph.add_edge(&v2, &v0);
b.iter(|| {
let _k = graph.is_cyclic();
})
});
c.bench_function("is_cyclic_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let v0 = graph.add_vertex(0);
let mut v1 = graph.add_vertex(1);
let mut v2 = graph.add_vertex(2);
graph.add_edge(&v0, &v1);
graph.add_edge(&v1, &v2);
for i in 4..=500 {
v1 = v2.clone();
v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
}
graph.add_edge(&v2, &v0);
b.iter(|| {
let _k = graph.is_cyclic();
})
});
c.bench_function("is_cyclic_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let v0 = graph.add_vertex(0);
let mut v1 = graph.add_vertex(1);
let mut v2 = graph.add_vertex(2);
graph.add_edge(&v0, &v1);
graph.add_edge(&v1, &v2);
for i in 4..=1000 {
v1 = v2.clone();
v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
}
graph.add_edge(&v2, &v0);
b.iter(|| {
let _k = graph.is_cyclic();
})
});
#[cfg(feature = "sbench")]
c.bench_function("is_cyclic_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let v0 = graph.add_vertex(0);
let mut v1 = graph.add_vertex(1);
let mut v2 = graph.add_vertex(2);
graph.add_edge(&v0, &v1);
graph.add_edge(&v1, &v2);
for i in 4..=10_000_000 {
v1 = v2.clone();
v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
}
graph.add_edge(&v2, &v0);
b.iter(|| {
let _k = graph.is_cyclic();
})
});
c.bench_function("remove_10", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=10 {
let v1 = graph.add_vertex(i);
graph.remove(&v1);
}
})
});
c.bench_function("remove_100", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=100 {
let v1 = graph.add_vertex(i);
graph.remove(&v1);
}
})
});
c.bench_function("remove_500", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=500 {
let v1 = graph.add_vertex(i);
graph.remove(&v1);
}
})
});
c.bench_function("remove_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=1000 {
let v1 = graph.add_vertex(i);
graph.remove(&v1);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("remove_m", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
for i in 1..=10_000_000 {
let v1 = graph.add_vertex(i);
graph.remove(&v1);
}
})
});
c.bench_function("remove_edge_10", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
graph.remove_edge(&v1, &v2);
}
})
});
c.bench_function("remove_edge_100", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
graph.remove_edge(&v1, &v2);
}
})
});
c.bench_function("remove_edge_500", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
graph.remove_edge(&v1, &v2);
}
})
});
c.bench_function("remove_edge_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
graph.remove_edge(&v1, &v2);
}
})
});
#[cfg(feature = "sbench")]
c.bench_function("remove_edge_m", |b| {
let mut graph: Graph<usize> = Graph::new();
b.iter(|| {
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
graph.remove_edge(&v1, &v2);
}
})
});
c.bench_function("reserve_10", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(10);
for i in 1..=10 {
graph.add_vertex(i);
}
b.iter(|| {
graph.reserve(10);
})
});
c.bench_function("reserve_100", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(100);
for i in 1..=100 {
graph.add_vertex(i);
}
b.iter(|| {
graph.reserve(100);
})
});
c.bench_function("reserve_500", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(500);
for i in 1..=500 {
graph.add_vertex(i);
}
b.iter(|| {
graph.reserve(500);
})
});
c.bench_function("reserve_1000", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(1000);
for i in 1..=1000 {
graph.add_vertex(i);
}
b.iter(|| {
graph.reserve(1000);
})
});
#[cfg(feature = "sbench")]
c.bench_function("reserve_m", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(10_000_000);
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
b.iter(|| {
graph.reserve(10_000_000);
})
});
c.bench_function("retain_10", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10 {
graph.add_vertex(i);
}
b.iter(|| {
graph.retain(|v| *v != 2);
})
});
c.bench_function("retain_100", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=100 {
graph.add_vertex(i);
}
b.iter(|| {
graph.retain(|v| *v != 2);
})
});
c.bench_function("retain_500", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=500 {
graph.add_vertex(i);
}
b.iter(|| {
graph.retain(|v| *v != 2);
})
});
c.bench_function("retain_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=1000 {
graph.add_vertex(i);
}
b.iter(|| {
graph.retain(|v| *v != 2);
})
});
#[cfg(feature = "sbench")]
c.bench_function("retain_m", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
b.iter(|| {
graph.retain(|v| *v != 2);
})
});
c.bench_function("roots_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.roots_count();
})
});
c.bench_function("roots_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=100 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.roots_count();
})
});
c.bench_function("roots_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=500 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.roots_count();
})
});
c.bench_function("roots_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=1000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.roots_count();
})
});
#[cfg(feature = "sbench")]
c.bench_function("roots_count_m", |b| {
let mut graph: Graph<usize> = Graph::new();
let mut v1 = graph.add_vertex(0);
for i in 1..=10_000_000 {
let v2 = graph.add_vertex(i);
graph.add_edge(&v1, &v2);
v1 = v2.clone();
}
b.iter(|| {
let _k = graph.roots_count();
})
});
c.bench_function("shrink_to_fit_10", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(10);
b.iter(|| {
graph.shrink_to_fit();
})
});
c.bench_function("shrink_to_fit_100", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(100);
b.iter(|| {
graph.shrink_to_fit();
})
});
c.bench_function("shrink_to_fit_500", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(500);
b.iter(|| {
graph.shrink_to_fit();
})
});
c.bench_function("shrink_to_fit_1000", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(1000);
b.iter(|| {
graph.shrink_to_fit();
})
});
#[cfg(feature = "sbench")]
c.bench_function("shrink_to_fit_m", |b| {
let mut graph: Graph<usize> = Graph::with_capacity(10_000_000);
b.iter(|| {
graph.shrink_to_fit();
})
});
c.bench_function("vertex_count_10", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10 {
graph.add_vertex(i);
}
b.iter(|| {
let _k = graph.vertex_count();
})
});
c.bench_function("vertex_count_100", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=100 {
graph.add_vertex(i);
}
b.iter(|| {
let _k = graph.vertex_count();
})
});
c.bench_function("vertex_count_500", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=500 {
graph.add_vertex(i);
}
b.iter(|| {
let _k = graph.vertex_count();
})
});
c.bench_function("vertex_count_1000", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=1000 {
graph.add_vertex(i);
}
b.iter(|| {
let _k = graph.vertex_count();
})
});
#[cfg(feature = "sbench")]
c.bench_function("vertex_count_m", |b| {
let mut graph: Graph<usize> = Graph::new();
for i in 1..=10_000_000 {
graph.add_vertex(i);
}
b.iter(|| {
let _k = graph.vertex_count();
})
});
}
criterion_group!(
benches,
bench_create,
bench_iterators,
bench_neighbor_functions,
bench_others
);
criterion_main!(benches);