blob: d9f7c1a0249cbcb4f8525e5825811168d70cf688 [file] [log] [blame] [edit]
#![feature(test)]
#![cfg(feature = "rayon")]
extern crate petgraph;
extern crate test;
use petgraph::prelude::*;
use rayon::iter::ParallelIterator;
use std::hash::BuildHasher;
use test::Bencher;
#[derive(Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
struct MyStruct {
u: String,
v: String,
w: String,
}
fn test_nodes() -> Vec<MyStruct> {
let mut nodes = vec![];
for i in 0..2500 {
nodes.push(MyStruct {
u: format!("X {}", i),
v: format!("Y {} Y", i),
w: format!("{}Z", i),
});
}
nodes
}
fn test_graph<H: BuildHasher + Default>(
data: &Vec<MyStruct>,
) -> GraphMap<&MyStruct, usize, Directed, H> {
let mut gr = GraphMap::new();
for i in 0..2500 {
gr.add_node(&data[i]);
}
for i in 0..1_000 {
for j in 999..2000 {
gr.add_edge(&data[i], &data[j], i * j);
}
}
gr
}
macro_rules! test_case_with_hasher {
($name:ident, $hasher:path) => {
#[bench]
fn $name(bench: &mut Bencher) {
let data = test_nodes();
let gr = test_graph::<$hasher>(&data);
bench.iter(|| {
let mut sources = vec![];
for n in gr.nodes() {
for (src, _, e) in gr.edges_directed(n, Direction::Outgoing) {
if *e == 500 {
sources.push(src.clone());
}
}
}
});
}
};
}
test_case_with_hasher!(graphmap_serial_bench, std::hash::RandomState);
test_case_with_hasher!(graphmap_serial_bench_fxhash, fxhash::FxBuildHasher);
test_case_with_hasher!(graphmap_serial_bench_ahash, ahash::RandomState);
#[bench]
fn graphmap_parallel_bench(bench: &mut Bencher) {
let data = test_nodes();
let gr = test_graph::<std::hash::RandomState>(&data);
bench.iter(|| {
let sources: Vec<MyStruct> = gr
.par_nodes()
.map(|n| {
let mut sources = vec![];
for (src, _, e) in gr.edges_directed(n, Direction::Outgoing) {
if *e == 500 {
sources.push(src.clone());
}
}
sources
})
.flatten()
.collect();
});
}