From 92a9d4eee080169b05e635b90228830b30cb5773 Mon Sep 17 00:00:00 2001 From: bluss Date: Sat, 23 Sep 2017 20:12:13 +0200 Subject: [PATCH] FEAT: Speed up Graph, StableGraph::map Use Vec::extend instead of a push loop -- this improves performance. Microbenchmark results: ``` name old ns/iter new ns/iter diff ns/iter diff % graph_map 569 323 -246 -43.23% stable_graph_map 594 405 -189 -31.82% ``` --- benches/stable_graph.rs | 14 ++++++++++++++ src/graph_impl/mod.rs | 14 ++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/benches/stable_graph.rs b/benches/stable_graph.rs index c6fa2cb7c..b981af30a 100644 --- a/benches/stable_graph.rs +++ b/benches/stable_graph.rs @@ -176,3 +176,17 @@ fn parse_graph(s: &str) -> Graph<(), (), Ty> gr } + +#[bench] +fn stable_graph_map(bench: &mut Bencher) +{ + let a = parse_stable_graph::(BIGGER); + bench.iter(|| a.map(|i, _| i, |i, _| i)); +} + +#[bench] +fn graph_map(bench: &mut Bencher) +{ + let a = parse_graph::(BIGGER); + bench.iter(|| a.map(|i, _| i, |i, _| i)); +} diff --git a/src/graph_impl/mod.rs b/src/graph_impl/mod.rs index e52f6f7d4..9599e11f8 100644 --- a/src/graph_impl/mod.rs +++ b/src/graph_impl/mod.rs @@ -1264,19 +1264,17 @@ impl Graph G: FnMut(EdgeIndex, &'a E) -> E2, { let mut g = Graph::with_capacity(self.node_count(), self.edge_count()); - for (i, node) in enumerate(&self.nodes) { - g.nodes.push(Node { + g.nodes.extend(enumerate(&self.nodes).map(|(i, node)| + Node { weight: node_map(NodeIndex::new(i), &node.weight), next: node.next, - }); - } - for (i, edge) in enumerate(&self.edges) { - g.edges.push(Edge { + })); + g.edges.extend(enumerate(&self.edges).map(|(i, edge)| + Edge { weight: edge_map(EdgeIndex::new(i), &edge.weight), next: edge.next, node: edge.node, - }); - } + })); g }