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