1 #![feature(test)]
2 #![cfg(feature = "rayon")]
3
4 extern crate petgraph;
5 extern crate test;
6
7 use petgraph::prelude::*;
8 use rayon::iter::ParallelIterator;
9 use std::hash::BuildHasher;
10 use test::Bencher;
11
12 #[derive(Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
13 struct MyStruct {
14 u: String,
15 v: String,
16 w: String,
17 }
18
test_nodes() -> Vec<MyStruct>19 fn test_nodes() -> Vec<MyStruct> {
20 let mut nodes = vec![];
21 for i in 0..2500 {
22 nodes.push(MyStruct {
23 u: format!("X {}", i),
24 v: format!("Y {} Y", i),
25 w: format!("{}Z", i),
26 });
27 }
28
29 nodes
30 }
31
test_graph<H: BuildHasher + Default>( data: &Vec<MyStruct>, ) -> GraphMap<&MyStruct, usize, Directed, H>32 fn test_graph<H: BuildHasher + Default>(
33 data: &Vec<MyStruct>,
34 ) -> GraphMap<&MyStruct, usize, Directed, H> {
35 let mut gr = GraphMap::new();
36
37 for i in 0..2500 {
38 gr.add_node(&data[i]);
39 }
40
41 for i in 0..1_000 {
42 for j in 999..2000 {
43 gr.add_edge(&data[i], &data[j], i * j);
44 }
45 }
46
47 gr
48 }
49
50 macro_rules! test_case_with_hasher {
51 ($name:ident, $hasher:path) => {
52 #[bench]
53 fn $name(bench: &mut Bencher) {
54 let data = test_nodes();
55 let gr = test_graph::<$hasher>(&data);
56 bench.iter(|| {
57 let mut sources = vec![];
58 for n in gr.nodes() {
59 for (src, _, e) in gr.edges_directed(n, Direction::Outgoing) {
60 if *e == 500 {
61 sources.push(src.clone());
62 }
63 }
64 }
65 });
66 }
67 };
68 }
69
70 test_case_with_hasher!(graphmap_serial_bench, std::hash::RandomState);
71 test_case_with_hasher!(graphmap_serial_bench_fxhash, fxhash::FxBuildHasher);
72 test_case_with_hasher!(graphmap_serial_bench_ahash, ahash::RandomState);
73
74 #[bench]
graphmap_parallel_bench(bench: &mut Bencher)75 fn graphmap_parallel_bench(bench: &mut Bencher) {
76 let data = test_nodes();
77 let gr = test_graph::<std::hash::RandomState>(&data);
78 bench.iter(|| {
79 let sources: Vec<MyStruct> = gr
80 .par_nodes()
81 .map(|n| {
82 let mut sources = vec![];
83 for (src, _, e) in gr.edges_directed(n, Direction::Outgoing) {
84 if *e == 500 {
85 sources.push(src.clone());
86 }
87 }
88
89 sources
90 })
91 .flatten()
92 .collect();
93 });
94 }
95