Use the .entry API instead of a separate .get and .insert

This improves performance, specifically it saves up to 6.2%
instructions (on slow_before/after.rs).
parallel_diffing
Wilfred Hughes 2022-07-25 00:23:24 +07:00
parent b9f048e87e
commit 5d195bcfad
1 changed files with 14 additions and 10 deletions

@ -1,7 +1,7 @@
//! Implements Dijkstra's algorithm for shortest path, to find an //! Implements Dijkstra's algorithm for shortest path, to find an
//! optimal and readable diff between two ASTs. //! optimal and readable diff between two ASTs.
use std::{cmp::Reverse, env}; use std::{cmp::Reverse, collections::hash_map::Entry, env};
use crate::{ use crate::{
diff::changes::ChangeMap, diff::changes::ChangeMap,
@ -51,16 +51,20 @@ fn shortest_vertex_path(
for neighbour in &mut neighbour_buf { for neighbour in &mut neighbour_buf {
if let Some((edge, next)) = neighbour.take() { if let Some((edge, next)) = neighbour.take() {
let distance_to_next = distance + edge.cost(); let distance_to_next = distance + edge.cost();
let found_shorter_route = match predecessors.get(&next) {
Some((prev_shortest, _)) => distance_to_next < *prev_shortest,
_ => true,
};
if found_shorter_route {
predecessors.insert(next, (distance_to_next, current));
heap.push(Reverse(distance_to_next), next); match predecessors.entry(next) {
} Entry::Occupied(mut o) => {
let prev_shortest: u64 = o.get().0;
if distance_to_next < prev_shortest {
*o.get_mut() = (distance_to_next, current);
heap.push(Reverse(distance_to_next), next);
}
}
Entry::Vacant(v) => {
v.insert((distance_to_next, current));
heap.push(Reverse(distance_to_next), next);
}
};
} }
} }
if predecessors.len() > graph_limit { if predecessors.len() > graph_limit {