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%
```
diff --git a/benches/stable_graph.rs b/benches/stable_graph.rs
index c6fa2cb..b981af3 100644
--- a/benches/stable_graph.rs
+++ b/benches/stable_graph.rs
@@ -176,3 +176,17 @@
gr
}
+
+#[bench]
+fn stable_graph_map(bench: &mut Bencher)
+{
+ let a = parse_stable_graph::<Directed>(BIGGER);
+ bench.iter(|| a.map(|i, _| i, |i, _| i));
+}
+
+#[bench]
+fn graph_map(bench: &mut Bencher)
+{
+ let a = parse_graph::<Directed>(BIGGER);
+ bench.iter(|| a.map(|i, _| i, |i, _| i));
+}
diff --git a/src/graph_impl/mod.rs b/src/graph_impl/mod.rs
index e52f6f7..9599e11 100644
--- a/src/graph_impl/mod.rs
+++ b/src/graph_impl/mod.rs
@@ -1264,19 +1264,17 @@
G: FnMut(EdgeIndex<Ix>, &'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
}