From a59e23043c041d9f313f24db08ef4a7619edd779 Mon Sep 17 00:00:00 2001 From: Michael Bell Date: Fri, 1 Jan 2021 16:54:07 +0000 Subject: [PATCH] Avoid copying ManyToMany table results Regardless of any copy elision on the returned pair value, the duration and distance results are always copied. Fix this by passing rvalue references to std::make_pair. --- CHANGELOG.md | 2 ++ src/engine/routing_algorithms/many_to_many_ch.cpp | 2 +- src/engine/routing_algorithms/many_to_many_mld.cpp | 14 +++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08ea480ff..af99a218c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - ADDED: Added support for multiple via-way restrictions. [#5907](https://github.com/Project-OSRM/osrm-backend/pull/5907) - ADDED: Add node bindings support for Node 12, 14, and publish binaries [#5918](https://github.com/Project-OSRM/osrm-backend/pull/5918) - REMOVED: we no longer publish Node 8 binary modules (they are still buildable from source) [#5918](https://github.com/Project-OSRM/osrm-backend/pull/5918) + - Routing: + - FIXED: Avoid copying ManyToMany table results [#5923](https://github.com/Project-OSRM/osrm-backend/pull/5923) - Misc: - CHANGED: Unify `.osrm.turn_penalites_index` dump processing same with `.osrm.turn_weight_penalties` and `.osrm.turn_duration_penalties` [#5868](https://github.com/Project-OSRM/osrm-backend/pull/5868) - Profile: diff --git a/src/engine/routing_algorithms/many_to_many_ch.cpp b/src/engine/routing_algorithms/many_to_many_ch.cpp index 03ef4dc0a..2d2108cb2 100644 --- a/src/engine/routing_algorithms/many_to_many_ch.cpp +++ b/src/engine/routing_algorithms/many_to_many_ch.cpp @@ -248,7 +248,7 @@ manyToManySearch(SearchEngineData &engine_working_data, } } - return std::make_pair(durations_table, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } } // namespace routing_algorithms diff --git a/src/engine/routing_algorithms/many_to_many_mld.cpp b/src/engine/routing_algorithms/many_to_many_mld.cpp index 62c9d8056..9607ccf09 100644 --- a/src/engine/routing_algorithms/many_to_many_mld.cpp +++ b/src/engine/routing_algorithms/many_to_many_mld.cpp @@ -219,8 +219,8 @@ oneToManySearch(SearchEngineData &engine_working_data, const std::vector &phantom_indices, const bool calculate_distance) { - std::vector weights(phantom_indices.size(), INVALID_EDGE_WEIGHT); - std::vector durations(phantom_indices.size(), MAXIMAL_EDGE_DURATION); + std::vector weights_table(phantom_indices.size(), INVALID_EDGE_WEIGHT); + std::vector durations_table(phantom_indices.size(), MAXIMAL_EDGE_DURATION); std::vector distances_table(calculate_distance ? phantom_indices.size() : 0, MAXIMAL_EDGE_DISTANCE); std::vector middle_nodes_table(phantom_indices.size(), SPECIAL_NODEID); @@ -298,10 +298,10 @@ oneToManySearch(SearchEngineData &engine_working_data, distances_table.empty() ? nulldistance : distances_table[index]; if (std::tie(path_weight, path_duration, path_distance) < - std::tie(weights[index], durations[index], current_distance)) + std::tie(weights_table[index], durations_table[index], current_distance)) { - weights[index] = path_weight; - durations[index] = path_duration; + weights_table[index] = path_weight; + durations_table[index] = path_duration; current_distance = path_distance; middle_nodes_table[index] = node; } @@ -392,7 +392,7 @@ oneToManySearch(SearchEngineData &engine_working_data, facade, heapNode, query_heap, phantom_nodes, phantom_index, phantom_indices); } - return std::make_pair(durations, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } // @@ -601,7 +601,7 @@ manyToManySearch(SearchEngineData &engine_working_data, } } - return std::make_pair(durations_table, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } } // namespace mld