95 lines
2.3 KiB
Rust
95 lines
2.3 KiB
Rust
#![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();
|
|
});
|
|
}
|